intention-coding 0.3.8 → 0.4.1
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/package.json +1 -1
- package/dist/db/file-storage.js +0 -638
- package/dist/index.js +0 -26
- package/dist/server/index.js +0 -88
- package/dist/services/bug-fix-agent/index.js +0 -320
- package/dist/services/change-summarizer/index.js +0 -123
- package/dist/services/change-summarizer/prompt/change-analysis.js +0 -56
- package/dist/services/code-generator/index.js +0 -403
- package/dist/services/code-generator/stages/execution-stage.js +0 -549
- package/dist/services/code-generator/stages/ideation-stage.js +0 -267
- package/dist/services/code-generator/stages/optimization-stage.js +0 -334
- package/dist/services/code-generator/stages/planning-stage.js +0 -295
- package/dist/services/code-generator/stages/research-stage.js +0 -283
- package/dist/services/code-generator/stages/review-stage.js +0 -270
- package/dist/services/code-generator/types.js +0 -37
- package/dist/services/code-generator/utils/instruction-executor.js +0 -207
- package/dist/services/code-generator/workflow-manager.js +0 -252
- package/dist/services/image-analysis/analyzer.js +0 -530
- package/dist/services/image-analysis/index.js +0 -406
- package/dist/services/image-analysis/types.js +0 -46
- package/dist/services/image-converter/converter.js +0 -310
- package/dist/services/image-converter/index.js +0 -262
- package/dist/services/image-converter/types.js +0 -31
- package/dist/services/integrated-generator/index.js +0 -1297
- package/dist/services/pdf2md/index.js +0 -180
- package/dist/services/project-template/index.js +0 -83
- package/dist/services/project-template/prompt/project-rules.js +0 -98
- package/dist/services/requirement-analyzer/chunk-reader.js +0 -218
- package/dist/services/requirement-analyzer/core/document-generator.js +0 -254
- package/dist/services/requirement-analyzer/core/intelligent-analyzer.js +0 -169
- package/dist/services/requirement-analyzer/core/project-analyzer.js +0 -199
- package/dist/services/requirement-analyzer/core/requirement-analyzer-service.js +0 -191
- package/dist/services/requirement-analyzer/core/template-selector.js +0 -124
- package/dist/services/requirement-analyzer/core/types.js +0 -23
- package/dist/services/requirement-analyzer/index.js +0 -177
- package/dist/services/requirement-analyzer/prompt/api-template.js +0 -302
- package/dist/services/requirement-analyzer/prompt/app-template.js +0 -455
- package/dist/services/requirement-analyzer/prompt/intelligent-requirement-analysis.js +0 -92
- package/dist/services/requirement-analyzer/prompt/pc-page-template.js +0 -582
- package/dist/services/requirement-analyzer/prompt/requirement-analysis.js +0 -664
- package/dist/services/requirement-analyzer/prompt/sdk-template.js +0 -582
- package/dist/services/requirement-analyzer/utils/file-reader.js +0 -169
- package/dist/services/world2md/index.js +0 -157
- package/dist/types/index.js +0 -2
- package/dist/utils/common.js +0 -72
- package/dist/utils/config.js +0 -163
- package/dist/utils/context-manager.js +0 -114
- package/dist/utils/dify.js +0 -243
- package/dist/utils/logger.js +0 -129
- package/dist/utils/openai.js +0 -225
- package/dist/utils/pack.js +0 -75
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.IdeationStage = void 0;
|
|
13
|
-
const logger_1 = require("../../../utils/logger");
|
|
14
|
-
const openai_1 = require("../../../utils/openai");
|
|
15
|
-
const types_1 = require("../types");
|
|
16
|
-
/**
|
|
17
|
-
* 构思阶段处理器
|
|
18
|
-
* 职责:生成多个可行的解决方案并进行评估
|
|
19
|
-
*/
|
|
20
|
-
class IdeationStage {
|
|
21
|
-
/**
|
|
22
|
-
* 执行构思阶段
|
|
23
|
-
*/
|
|
24
|
-
execute(task, _input) {
|
|
25
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
-
try {
|
|
27
|
-
logger_1.logger.info('开始执行构思阶段', { taskId: task.id });
|
|
28
|
-
// 生成解决方案
|
|
29
|
-
const solutions = yield this.generateSolutions(task);
|
|
30
|
-
// 评估和排序方案
|
|
31
|
-
const evaluatedSolutions = yield this.evaluateSolutions(solutions, task);
|
|
32
|
-
// 生成响应
|
|
33
|
-
const response = this.generateResponse(evaluatedSolutions);
|
|
34
|
-
logger_1.logger.info('构思阶段执行完成', {
|
|
35
|
-
taskId: task.id,
|
|
36
|
-
solutionCount: evaluatedSolutions.length
|
|
37
|
-
});
|
|
38
|
-
return response;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
logger_1.logger.error('构思阶段执行失败', { error, taskId: task.id });
|
|
42
|
-
throw new types_1.CodeGeneratorError('方案生成过程中发生错误,请重试', types_1.ErrorCodes.SOLUTION_GENERATION_FAILED, types_1.WorkflowStage.IDEATION, { taskId: task.id, originalError: error });
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 生成解决方案
|
|
48
|
-
*/
|
|
49
|
-
generateSolutions(task) {
|
|
50
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
const { taskDescription, projectInfo, requirements } = task.context;
|
|
52
|
-
const prompt = `你是一位资深的软件架构师,请为以下任务生成多个可行的解决方案。
|
|
53
|
-
|
|
54
|
-
## 任务描述
|
|
55
|
-
${taskDescription}
|
|
56
|
-
|
|
57
|
-
## 项目信息
|
|
58
|
-
${projectInfo ? `
|
|
59
|
-
- 技术栈:${projectInfo.techStack.join(', ')}
|
|
60
|
-
- 框架:${projectInfo.frameworks.join(', ')}
|
|
61
|
-
- 语言:${projectInfo.language}
|
|
62
|
-
` : '- 通用项目'}
|
|
63
|
-
|
|
64
|
-
## 需求分析
|
|
65
|
-
- 完整性评分:${requirements.completenessScore}/10
|
|
66
|
-
- 目标明确性:${requirements.targetClarity}/3
|
|
67
|
-
- 预期结果:${requirements.expectedResults}/3
|
|
68
|
-
|
|
69
|
-
请生成至少2-3个不同的解决方案,每个方案应该:
|
|
70
|
-
1. 有明确的名称和描述
|
|
71
|
-
2. 列出优缺点
|
|
72
|
-
3. 评估复杂度和风险
|
|
73
|
-
4. 估算开发时间
|
|
74
|
-
5. 说明技术要求
|
|
75
|
-
|
|
76
|
-
请以JSON格式返回:
|
|
77
|
-
{
|
|
78
|
-
"solutions": [
|
|
79
|
-
{
|
|
80
|
-
"id": "solution_1",
|
|
81
|
-
"name": "方案名称",
|
|
82
|
-
"description": "详细描述",
|
|
83
|
-
"pros": ["优点1", "优点2"],
|
|
84
|
-
"cons": ["缺点1", "缺点2"],
|
|
85
|
-
"complexity": "low|medium|high",
|
|
86
|
-
"estimatedTime": "时间估算",
|
|
87
|
-
"techRequirements": ["技术要求1", "技术要求2"],
|
|
88
|
-
"riskLevel": "low|medium|high"
|
|
89
|
-
}
|
|
90
|
-
]
|
|
91
|
-
}`;
|
|
92
|
-
try {
|
|
93
|
-
const result = yield openai_1.openAIService.generateText({
|
|
94
|
-
prompt,
|
|
95
|
-
system_prompt: "你是专业的软件架构师,请严格按照JSON格式返回解决方案。"
|
|
96
|
-
});
|
|
97
|
-
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
98
|
-
if (jsonMatch) {
|
|
99
|
-
const data = JSON.parse(jsonMatch[0]);
|
|
100
|
-
return data.solutions.map((sol, index) => (Object.assign(Object.assign({}, sol), { id: sol.id || `solution_${index + 1}`, score: 0 // 初始评分,后续计算
|
|
101
|
-
})));
|
|
102
|
-
}
|
|
103
|
-
throw new Error('无法解析AI生成的解决方案');
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
logger_1.logger.error('解决方案生成失败', { error });
|
|
107
|
-
// 返回默认方案
|
|
108
|
-
return this.getDefaultSolutions(task);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* 评估解决方案
|
|
114
|
-
*/
|
|
115
|
-
evaluateSolutions(solutions, task) {
|
|
116
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
const evaluatedSolutions = solutions.map(solution => {
|
|
118
|
-
// 计算综合评分
|
|
119
|
-
let score = 0;
|
|
120
|
-
// 复杂度评分 (复杂度越低分数越高)
|
|
121
|
-
switch (solution.complexity) {
|
|
122
|
-
case 'low':
|
|
123
|
-
score += 30;
|
|
124
|
-
break;
|
|
125
|
-
case 'medium':
|
|
126
|
-
score += 20;
|
|
127
|
-
break;
|
|
128
|
-
case 'high':
|
|
129
|
-
score += 10;
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
// 风险评分 (风险越低分数越高)
|
|
133
|
-
switch (solution.riskLevel) {
|
|
134
|
-
case 'low':
|
|
135
|
-
score += 25;
|
|
136
|
-
break;
|
|
137
|
-
case 'medium':
|
|
138
|
-
score += 15;
|
|
139
|
-
break;
|
|
140
|
-
case 'high':
|
|
141
|
-
score += 5;
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
// 技术匹配度评分
|
|
145
|
-
if (task.context.projectInfo) {
|
|
146
|
-
const techMatch = solution.techRequirements.some(req => task.context.projectInfo.techStack.some(tech => req.toLowerCase().includes(tech.toLowerCase())));
|
|
147
|
-
if (techMatch)
|
|
148
|
-
score += 20;
|
|
149
|
-
}
|
|
150
|
-
// 优缺点平衡评分
|
|
151
|
-
const prosCount = solution.pros.length;
|
|
152
|
-
const consCount = solution.cons.length;
|
|
153
|
-
if (prosCount > consCount)
|
|
154
|
-
score += 15;
|
|
155
|
-
else if (prosCount === consCount)
|
|
156
|
-
score += 10;
|
|
157
|
-
else
|
|
158
|
-
score += 5;
|
|
159
|
-
// 时间估算合理性评分
|
|
160
|
-
if (solution.estimatedTime.includes('天') || solution.estimatedTime.includes('小时')) {
|
|
161
|
-
score += 10;
|
|
162
|
-
}
|
|
163
|
-
return Object.assign(Object.assign({}, solution), { score });
|
|
164
|
-
});
|
|
165
|
-
// 按评分排序
|
|
166
|
-
return evaluatedSolutions.sort((a, b) => b.score - a.score);
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* 生成响应
|
|
171
|
-
*/
|
|
172
|
-
generateResponse(solutions) {
|
|
173
|
-
return {
|
|
174
|
-
stage: types_1.WorkflowStage.IDEATION,
|
|
175
|
-
status: 'success',
|
|
176
|
-
message: this.formatSolutionsMessage(solutions),
|
|
177
|
-
data: { solutions },
|
|
178
|
-
nextActions: ['选择方案进入计划阶段', '修改方案', '重新生成方案'],
|
|
179
|
-
requiresUserConfirmation: true
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* 格式化方案消息
|
|
184
|
-
*/
|
|
185
|
-
formatSolutionsMessage(solutions) {
|
|
186
|
-
const solutionsText = solutions.map((solution, index) => `
|
|
187
|
-
## 方案 ${index + 1}:${solution.name} (评分: ${solution.score})
|
|
188
|
-
|
|
189
|
-
**描述**:${solution.description}
|
|
190
|
-
|
|
191
|
-
**优点**:
|
|
192
|
-
${solution.pros.map(pro => `- ✅ ${pro}`).join('\n')}
|
|
193
|
-
|
|
194
|
-
**缺点**:
|
|
195
|
-
${solution.cons.map(con => `- ❌ ${con}`).join('\n')}
|
|
196
|
-
|
|
197
|
-
**技术要求**:${solution.techRequirements.join(', ')}
|
|
198
|
-
**复杂度**:${this.getComplexityLabel(solution.complexity)}
|
|
199
|
-
**风险等级**:${this.getRiskLabel(solution.riskLevel)}
|
|
200
|
-
**预估时间**:${solution.estimatedTime}
|
|
201
|
-
`).join('\n---\n');
|
|
202
|
-
return `
|
|
203
|
-
# [模式:构思] 解决方案生成完成 💡
|
|
204
|
-
|
|
205
|
-
已生成 ${solutions.length} 个可行的解决方案,按推荐度排序:
|
|
206
|
-
|
|
207
|
-
${solutionsText}
|
|
208
|
-
|
|
209
|
-
## 📊 推荐方案
|
|
210
|
-
|
|
211
|
-
**推荐选择方案 1:${solutions[0].name}**
|
|
212
|
-
- 综合评分最高 (${solutions[0].score}分)
|
|
213
|
-
- 在复杂度、风险和技术匹配度方面表现最佳
|
|
214
|
-
|
|
215
|
-
**请选择您偏好的方案,或提出修改建议。确认后将进入详细规划阶段。**
|
|
216
|
-
`.trim();
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* 获取默认方案
|
|
220
|
-
*/
|
|
221
|
-
getDefaultSolutions(task) {
|
|
222
|
-
var _a, _b;
|
|
223
|
-
return [
|
|
224
|
-
{
|
|
225
|
-
id: 'solution_1',
|
|
226
|
-
name: '标准实现方案',
|
|
227
|
-
description: '使用项目现有技术栈的标准实现方式',
|
|
228
|
-
pros: ['技术栈匹配', '开发风险低', '维护成本低'],
|
|
229
|
-
cons: ['可能缺乏创新性', '性能优化空间有限'],
|
|
230
|
-
complexity: 'medium',
|
|
231
|
-
estimatedTime: '3-5天',
|
|
232
|
-
techRequirements: ((_a = task.context.projectInfo) === null || _a === void 0 ? void 0 : _a.techStack) || ['通用技术'],
|
|
233
|
-
riskLevel: 'low',
|
|
234
|
-
score: 0
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
id: 'solution_2',
|
|
238
|
-
name: '优化实现方案',
|
|
239
|
-
description: '在标准方案基础上进行性能和架构优化',
|
|
240
|
-
pros: ['性能更好', '架构更清晰', '扩展性强'],
|
|
241
|
-
cons: ['开发时间较长', '复杂度较高'],
|
|
242
|
-
complexity: 'high',
|
|
243
|
-
estimatedTime: '5-8天',
|
|
244
|
-
techRequirements: ((_b = task.context.projectInfo) === null || _b === void 0 ? void 0 : _b.techStack) || ['通用技术'],
|
|
245
|
-
riskLevel: 'medium',
|
|
246
|
-
score: 0
|
|
247
|
-
}
|
|
248
|
-
];
|
|
249
|
-
}
|
|
250
|
-
getComplexityLabel(complexity) {
|
|
251
|
-
const labels = {
|
|
252
|
-
'low': '🟢 低',
|
|
253
|
-
'medium': '🟡 中',
|
|
254
|
-
'high': '🔴 高'
|
|
255
|
-
};
|
|
256
|
-
return labels[complexity] || complexity;
|
|
257
|
-
}
|
|
258
|
-
getRiskLabel(risk) {
|
|
259
|
-
const labels = {
|
|
260
|
-
'low': '🟢 低风险',
|
|
261
|
-
'medium': '🟡 中风险',
|
|
262
|
-
'high': '🔴 高风险'
|
|
263
|
-
};
|
|
264
|
-
return labels[risk] || risk;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
exports.IdeationStage = IdeationStage;
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.OptimizationStage = void 0;
|
|
13
|
-
const logger_1 = require("../../../utils/logger");
|
|
14
|
-
const openai_1 = require("../../../utils/openai");
|
|
15
|
-
const types_1 = require("../types");
|
|
16
|
-
/**
|
|
17
|
-
* 优化阶段处理器
|
|
18
|
-
* 职责:自动检查并分析已实现的代码,提出优化建议
|
|
19
|
-
*/
|
|
20
|
-
class OptimizationStage {
|
|
21
|
-
/**
|
|
22
|
-
* 执行优化阶段
|
|
23
|
-
*/
|
|
24
|
-
execute(task, _input) {
|
|
25
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
-
try {
|
|
27
|
-
logger_1.logger.info('开始执行优化阶段', { taskId: task.id });
|
|
28
|
-
// 获取执行结果
|
|
29
|
-
const executionResults = this.getExecutionResults(task);
|
|
30
|
-
// 分析代码并生成优化建议
|
|
31
|
-
const optimizationSuggestions = yield this.analyzeCodeAndGenerateSuggestions(task, executionResults);
|
|
32
|
-
// 生成响应
|
|
33
|
-
const response = this.generateResponse(optimizationSuggestions);
|
|
34
|
-
logger_1.logger.info('优化阶段执行完成', {
|
|
35
|
-
taskId: task.id,
|
|
36
|
-
suggestionCount: optimizationSuggestions.length
|
|
37
|
-
});
|
|
38
|
-
return response;
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
logger_1.logger.error('优化阶段执行失败', { error, taskId: task.id });
|
|
42
|
-
throw new types_1.CodeGeneratorError('代码优化分析过程中发生错误', types_1.ErrorCodes.OPTIMIZATION_FAILED, types_1.WorkflowStage.OPTIMIZATION, { taskId: task.id, originalError: error });
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 获取执行结果
|
|
48
|
-
*/
|
|
49
|
-
getExecutionResults(task) {
|
|
50
|
-
var _a;
|
|
51
|
-
const executionStage = task.stages.find(s => s.stage === types_1.WorkflowStage.EXECUTION);
|
|
52
|
-
if (!((_a = executionStage === null || executionStage === void 0 ? void 0 : executionStage.output) === null || _a === void 0 ? void 0 : _a.executionResults)) {
|
|
53
|
-
throw new Error('未找到执行结果');
|
|
54
|
-
}
|
|
55
|
-
return executionStage.output.executionResults;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* 分析代码并生成优化建议
|
|
59
|
-
*/
|
|
60
|
-
analyzeCodeAndGenerateSuggestions(task, executionResults) {
|
|
61
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
const { taskDescription, projectInfo } = task.context;
|
|
63
|
-
const prompt = `你是一位资深的代码审查专家,请分析以下代码实施结果并提出优化建议。
|
|
64
|
-
|
|
65
|
-
## 任务描述
|
|
66
|
-
${taskDescription}
|
|
67
|
-
|
|
68
|
-
## 执行结果
|
|
69
|
-
- 完成步骤: ${executionResults.completedSteps}/${executionResults.totalSteps}
|
|
70
|
-
- 成功率: ${(executionResults.completedSteps / executionResults.totalSteps * 100).toFixed(1)}%
|
|
71
|
-
|
|
72
|
-
## 已实现的功能
|
|
73
|
-
${executionResults.stepResults.filter((r) => r.status === 'completed').map((r) => r.result).join('\n')}
|
|
74
|
-
|
|
75
|
-
## 项目技术栈
|
|
76
|
-
${projectInfo ? `${projectInfo.techStack.join(', ')}` : '通用技术栈'}
|
|
77
|
-
|
|
78
|
-
请重点关注以下方面的优化:
|
|
79
|
-
1. **冗余代码**: 识别重复或不必要的代码
|
|
80
|
-
2. **性能优化**: 发现性能瓶颈和改进机会
|
|
81
|
-
3. **可维护性**: 提升代码结构和可读性
|
|
82
|
-
4. **安全性**: 识别潜在的安全问题
|
|
83
|
-
5. **最佳实践**: 确保符合行业标准和最佳实践
|
|
84
|
-
|
|
85
|
-
请以JSON格式返回优化建议:
|
|
86
|
-
{
|
|
87
|
-
"suggestions": [
|
|
88
|
-
{
|
|
89
|
-
"id": "opt_1",
|
|
90
|
-
"type": "redundancy|performance|maintainability|security|best_practice",
|
|
91
|
-
"description": "优化建议描述",
|
|
92
|
-
"currentCode": "当前代码示例",
|
|
93
|
-
"optimizedCode": "优化后代码示例",
|
|
94
|
-
"reason": "优化理由",
|
|
95
|
-
"expectedBenefit": "预期收益",
|
|
96
|
-
"impact": "low|medium|high",
|
|
97
|
-
"effort": "low|medium|high"
|
|
98
|
-
}
|
|
99
|
-
]
|
|
100
|
-
}`;
|
|
101
|
-
try {
|
|
102
|
-
const result = yield openai_1.openAIService.generateText({
|
|
103
|
-
prompt,
|
|
104
|
-
system_prompt: "你是专业的代码审查专家,请严格按照JSON格式返回优化建议。"
|
|
105
|
-
});
|
|
106
|
-
const jsonMatch = result.match(/\{[\s\S]*\}/);
|
|
107
|
-
if (jsonMatch) {
|
|
108
|
-
try {
|
|
109
|
-
const data = JSON.parse(jsonMatch[0]);
|
|
110
|
-
return data.suggestions.map((suggestion, index) => (Object.assign(Object.assign({}, suggestion), { id: suggestion.id || `opt_${index + 1}` })));
|
|
111
|
-
}
|
|
112
|
-
catch (parseError) {
|
|
113
|
-
logger_1.logger.error('JSON解析失败', {
|
|
114
|
-
error: parseError,
|
|
115
|
-
jsonString: jsonMatch[0].substring(0, 200) + '...'
|
|
116
|
-
});
|
|
117
|
-
throw new Error('AI返回的JSON格式无效');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
throw new Error('无法从AI响应中提取JSON');
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
logger_1.logger.error('优化建议生成失败', { error });
|
|
124
|
-
// 返回默认优化建议
|
|
125
|
-
return this.getDefaultOptimizationSuggestions();
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* 生成响应
|
|
131
|
-
*/
|
|
132
|
-
generateResponse(suggestions) {
|
|
133
|
-
if (suggestions.length === 0) {
|
|
134
|
-
return {
|
|
135
|
-
stage: types_1.WorkflowStage.OPTIMIZATION,
|
|
136
|
-
status: 'success',
|
|
137
|
-
message: this.formatNoOptimizationMessage(),
|
|
138
|
-
data: { suggestions: [] },
|
|
139
|
-
nextActions: ['进入评审阶段', '手动检查代码', '重新分析'],
|
|
140
|
-
requiresUserConfirmation: true
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
// 生成优化执行指令
|
|
144
|
-
const optimizationInstructions = this.generateOptimizationInstructions(suggestions);
|
|
145
|
-
return {
|
|
146
|
-
stage: types_1.WorkflowStage.OPTIMIZATION,
|
|
147
|
-
status: 'success',
|
|
148
|
-
message: this.formatOptimizationMessage(suggestions),
|
|
149
|
-
data: { suggestions },
|
|
150
|
-
nextActions: ['应用优化建议', '选择部分优化', '跳过优化进入评审', '重新分析'],
|
|
151
|
-
requiresUserConfirmation: true,
|
|
152
|
-
executionInstructions: optimizationInstructions
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* 格式化无优化建议消息
|
|
157
|
-
*/
|
|
158
|
-
formatNoOptimizationMessage() {
|
|
159
|
-
return `
|
|
160
|
-
# [模式:优化] 代码质量检查完成 ✅
|
|
161
|
-
|
|
162
|
-
## 🎉 优秀的代码质量
|
|
163
|
-
|
|
164
|
-
经过全面的代码质量分析,未发现明显的优化点:
|
|
165
|
-
|
|
166
|
-
- ✅ **冗余代码**: 无发现重复或不必要的代码
|
|
167
|
-
- ✅ **性能优化**: 无明显性能瓶颈
|
|
168
|
-
- ✅ **可维护性**: 代码结构清晰,可读性良好
|
|
169
|
-
- ✅ **安全性**: 无发现安全隐患
|
|
170
|
-
- ✅ **最佳实践**: 符合行业标准和最佳实践
|
|
171
|
-
|
|
172
|
-
## 🚀 建议
|
|
173
|
-
|
|
174
|
-
代码质量已达到生产标准,可以直接进入评审阶段。
|
|
175
|
-
|
|
176
|
-
**准备进入最终评审阶段...**
|
|
177
|
-
`.trim();
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* 格式化优化建议消息
|
|
181
|
-
*/
|
|
182
|
-
formatOptimizationMessage(suggestions) {
|
|
183
|
-
// 按影响程度分组
|
|
184
|
-
const highImpact = suggestions.filter(s => s.impact === 'high');
|
|
185
|
-
const mediumImpact = suggestions.filter(s => s.impact === 'medium');
|
|
186
|
-
const lowImpact = suggestions.filter(s => s.impact === 'low');
|
|
187
|
-
const formatSuggestions = (suggestions) => suggestions.map((suggestion, index) => `
|
|
188
|
-
### ${index + 1}. ${suggestion.description}
|
|
189
|
-
|
|
190
|
-
**类型**: ${this.getTypeLabel(suggestion.type)}
|
|
191
|
-
**影响程度**: ${this.getImpactLabel(suggestion.impact)}
|
|
192
|
-
**实施难度**: ${this.getEffortLabel(suggestion.effort)}
|
|
193
|
-
|
|
194
|
-
**优化理由**: ${suggestion.reason}
|
|
195
|
-
**预期收益**: ${suggestion.expectedBenefit}
|
|
196
|
-
|
|
197
|
-
**当前代码**:
|
|
198
|
-
\`\`\`
|
|
199
|
-
${suggestion.currentCode}
|
|
200
|
-
\`\`\`
|
|
201
|
-
|
|
202
|
-
**优化后代码**:
|
|
203
|
-
\`\`\`
|
|
204
|
-
${suggestion.optimizedCode}
|
|
205
|
-
\`\`\`
|
|
206
|
-
`).join('\n---\n');
|
|
207
|
-
return `
|
|
208
|
-
# [模式:优化] 代码优化建议 🚀
|
|
209
|
-
|
|
210
|
-
## 📊 优化概览
|
|
211
|
-
|
|
212
|
-
发现 **${suggestions.length}** 个优化点:
|
|
213
|
-
- 🔴 高影响: ${highImpact.length}个
|
|
214
|
-
- 🟡 中影响: ${mediumImpact.length}个
|
|
215
|
-
- 🟢 低影响: ${lowImpact.length}个
|
|
216
|
-
|
|
217
|
-
${highImpact.length > 0 ? `
|
|
218
|
-
## 🔴 高影响优化建议 (强烈推荐)
|
|
219
|
-
|
|
220
|
-
${formatSuggestions(highImpact)}
|
|
221
|
-
` : ''}
|
|
222
|
-
|
|
223
|
-
${mediumImpact.length > 0 ? `
|
|
224
|
-
## 🟡 中影响优化建议 (建议考虑)
|
|
225
|
-
|
|
226
|
-
${formatSuggestions(mediumImpact)}
|
|
227
|
-
` : ''}
|
|
228
|
-
|
|
229
|
-
${lowImpact.length > 0 ? `
|
|
230
|
-
## 🟢 低影响优化建议 (可选)
|
|
231
|
-
|
|
232
|
-
${formatSuggestions(lowImpact)}
|
|
233
|
-
` : ''}
|
|
234
|
-
|
|
235
|
-
## 💡 优化建议
|
|
236
|
-
|
|
237
|
-
${highImpact.length > 0 ?
|
|
238
|
-
'**强烈建议先处理高影响的优化点**,这些改进将显著提升代码质量。' :
|
|
239
|
-
'建议根据项目时间安排选择性应用优化建议。'}
|
|
240
|
-
|
|
241
|
-
**请选择要应用的优化建议,或确认跳过优化直接进入评审阶段。**
|
|
242
|
-
`.trim();
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* 获取默认优化建议
|
|
246
|
-
*/
|
|
247
|
-
getDefaultOptimizationSuggestions() {
|
|
248
|
-
return [
|
|
249
|
-
{
|
|
250
|
-
id: 'opt_1',
|
|
251
|
-
type: 'best_practice',
|
|
252
|
-
description: '添加错误处理和日志记录',
|
|
253
|
-
currentCode: '// 基础实现,缺少错误处理',
|
|
254
|
-
optimizedCode: '// 添加 try-catch 和日志记录',
|
|
255
|
-
reason: '提高代码健壮性和可调试性',
|
|
256
|
-
expectedBenefit: '减少生产环境问题,便于问题排查',
|
|
257
|
-
impact: 'medium',
|
|
258
|
-
effort: 'low'
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
id: 'opt_2',
|
|
262
|
-
type: 'maintainability',
|
|
263
|
-
description: '添加代码注释和文档',
|
|
264
|
-
currentCode: '// 缺少注释的代码',
|
|
265
|
-
optimizedCode: '// 添加详细注释的代码',
|
|
266
|
-
reason: '提高代码可读性和可维护性',
|
|
267
|
-
expectedBenefit: '降低后续维护成本',
|
|
268
|
-
impact: 'low',
|
|
269
|
-
effort: 'low'
|
|
270
|
-
}
|
|
271
|
-
];
|
|
272
|
-
}
|
|
273
|
-
getTypeLabel(type) {
|
|
274
|
-
const labels = {
|
|
275
|
-
'redundancy': '🔄 冗余代码',
|
|
276
|
-
'performance': '⚡ 性能优化',
|
|
277
|
-
'maintainability': '🔧 可维护性',
|
|
278
|
-
'security': '🔒 安全性',
|
|
279
|
-
'best_practice': '✨ 最佳实践'
|
|
280
|
-
};
|
|
281
|
-
return labels[type] || type;
|
|
282
|
-
}
|
|
283
|
-
getImpactLabel(impact) {
|
|
284
|
-
const labels = {
|
|
285
|
-
'high': '🔴 高',
|
|
286
|
-
'medium': '🟡 中',
|
|
287
|
-
'low': '🟢 低'
|
|
288
|
-
};
|
|
289
|
-
return labels[impact] || impact;
|
|
290
|
-
}
|
|
291
|
-
getEffortLabel(effort) {
|
|
292
|
-
const labels = {
|
|
293
|
-
'high': '🔴 高',
|
|
294
|
-
'medium': '🟡 中',
|
|
295
|
-
'low': '🟢 低'
|
|
296
|
-
};
|
|
297
|
-
return labels[effort] || effort;
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* 生成优化执行指令
|
|
301
|
-
*/
|
|
302
|
-
generateOptimizationInstructions(suggestions) {
|
|
303
|
-
const instructions = [];
|
|
304
|
-
let priority = 1;
|
|
305
|
-
// 按影响程度排序,高影响的优先执行
|
|
306
|
-
const sortedSuggestions = suggestions.sort((a, b) => {
|
|
307
|
-
const impactOrder = { 'high': 3, 'medium': 2, 'low': 1 };
|
|
308
|
-
return impactOrder[b.impact] - impactOrder[a.impact];
|
|
309
|
-
});
|
|
310
|
-
for (const suggestion of sortedSuggestions) {
|
|
311
|
-
// 为每个优化建议生成文件修改指令
|
|
312
|
-
instructions.push({
|
|
313
|
-
id: `optimize_${suggestion.id}`,
|
|
314
|
-
type: 'file_operation',
|
|
315
|
-
operation: 'modify',
|
|
316
|
-
targetPath: this.extractFilePathFromCode(suggestion.currentCode),
|
|
317
|
-
sourceContent: suggestion.currentCode,
|
|
318
|
-
newContent: suggestion.optimizedCode,
|
|
319
|
-
description: `优化: ${suggestion.description}`,
|
|
320
|
-
priority: priority++
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
return instructions;
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* 从代码中提取文件路径(简化实现)
|
|
327
|
-
*/
|
|
328
|
-
extractFilePathFromCode(code) {
|
|
329
|
-
// 这里可以根据实际情况实现更复杂的路径提取逻辑
|
|
330
|
-
// 目前返回一个通用路径,实际使用时需要根据具体情况调整
|
|
331
|
-
return 'src/main.ts';
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
exports.OptimizationStage = OptimizationStage;
|