* feat(mcp): 新增gva_review工具并优化字典和代码生成逻辑 * fix: 调整mcp整体逻辑 * chore: 更新.gitignore,添加对本地配置文件的忽略 * feat(logo): 新增Logo组件并在多个页面中替换原有logo实现 * fix: 修复菜单 Logo 部分删除文本后显示异常的问题 * fix:添加字典列表搜索,支持中英文搜索.添加字典详情搜索 * style: 优化部分视觉样式 * feat: 增强错误预览组件的暗黑模式支持 * feat: 优化请求错误消息获取逻辑,增加状态文本优先级 * feat: 添加前端登录验证码静态验证逻辑 * feat: 添加开发环境启动脚本 * feat: 更新 SvgIcon 组件,支持本地图标和 Iconify 图标、移除未使用的 unocss 依赖 * fix:字典支持 tree 结构 * feat: 优化动态路由注册方式 * feat: 添加配置控制标签页keep-alive功能 * feat: 添加全局错误处理机制,捕获 Vue 和 JS 错误 * refactor: 移除API和菜单创建结果中的权限分配提醒,优化输出信息 * feat: 更新 reset.scss,优化全局样式重置,增强兼容性和可读性 * refactor(字典详情): 优化字典详情查询逻辑,移除预加载改为按需加载 * refactor(路由管理): 优化路由添加逻辑,增强路径处理和顶级路由注册 * refactor(系统配置): 将auto-migrate修改为disable-auto-migrate,保证用户升级的兼容性 * feat(utils): 优化字典数据递归查找功能并替换select为tree-select * fix(deps): 修复在字段类型为file生成搜索条件无法运行的bug * fix: 修复header的tools中icon不展示的问题 --------- Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com> Co-authored-by: Azir-11 <2075125282@qq.com> Co-authored-by: bypanghu <bypanghu@163.com> Co-authored-by: feitianbubu <feitianbubu@qq.com> Co-authored-by: 青菜白玉汤 <79054161+Azir-11@users.noreply.github.com> Co-authored-by: krank <emosick@qq.com>
171 lines
6.4 KiB
Go
171 lines
6.4 KiB
Go
package mcpTool
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
"strings"
|
||
|
||
"github.com/mark3labs/mcp-go/mcp"
|
||
)
|
||
|
||
// GVAReviewer GVA代码审查工具
|
||
type GVAReviewer struct{}
|
||
|
||
// init 注册工具
|
||
func init() {
|
||
RegisterTool(&GVAReviewer{})
|
||
}
|
||
|
||
// ReviewRequest 审查请求结构
|
||
type ReviewRequest struct {
|
||
UserRequirement string `json:"userRequirement"` // 经过requirement_analyze后的用户需求
|
||
GeneratedFiles []string `json:"generatedFiles"` // gva_execute创建的文件列表
|
||
}
|
||
|
||
// ReviewResponse 审查响应结构
|
||
type ReviewResponse struct {
|
||
Success bool `json:"success"` // 是否审查成功
|
||
Message string `json:"message"` // 审查结果消息
|
||
AdjustmentPrompt string `json:"adjustmentPrompt"` // 调整代码的提示
|
||
ReviewDetails string `json:"reviewDetails"` // 详细的审查结果
|
||
}
|
||
|
||
// New 创建GVA代码审查工具
|
||
func (g *GVAReviewer) New() mcp.Tool {
|
||
return mcp.NewTool("gva_review",
|
||
mcp.WithDescription(`**GVA代码审查工具 - 在gva_execute调用后使用**
|
||
|
||
**核心功能:**
|
||
- 接收经过requirement_analyze处理的用户需求和gva_execute生成的文件列表
|
||
- 分析生成的代码是否满足用户的原始需求
|
||
- 检查是否涉及到关联、交互等复杂功能
|
||
- 如果代码不满足需求,提供调整建议和新的prompt
|
||
|
||
**使用场景:**
|
||
- 在gva_execute成功执行后调用
|
||
- 用于验证生成的代码是否完整满足用户需求
|
||
- 检查模块间的关联关系是否正确实现
|
||
- 发现缺失的交互功能或业务逻辑
|
||
|
||
**工作流程:**
|
||
1. 接收用户原始需求和生成的文件列表
|
||
2. 分析需求中的关键功能点
|
||
3. 检查生成的文件是否覆盖所有功能
|
||
4. 识别缺失的关联关系、交互功能等
|
||
5. 生成调整建议和新的开发prompt
|
||
|
||
**输出内容:**
|
||
- 审查结果和是否需要调整
|
||
- 详细的缺失功能分析
|
||
- 针对性的代码调整建议
|
||
- 可直接使用的开发prompt
|
||
|
||
**重要提示:**
|
||
- 本工具专门用于代码质量审查,不执行实际的代码修改
|
||
- 重点关注模块间关联、用户交互、业务流程完整性
|
||
- 提供的调整建议应该具体可执行`),
|
||
mcp.WithString("userRequirement",
|
||
mcp.Description("经过requirement_analyze处理后的用户需求描述,包含详细的功能要求和字段信息"),
|
||
mcp.Required(),
|
||
),
|
||
mcp.WithString("generatedFiles",
|
||
mcp.Description("gva_execute创建的文件列表,JSON字符串格式,包含所有生成的后端和前端文件路径"),
|
||
mcp.Required(),
|
||
),
|
||
)
|
||
}
|
||
|
||
// Handle 处理审查请求
|
||
func (g *GVAReviewer) Handle(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||
// 获取用户需求
|
||
userRequirementData, ok := request.GetArguments()["userRequirement"]
|
||
if !ok {
|
||
return nil, errors.New("参数错误:userRequirement 必须提供")
|
||
}
|
||
|
||
userRequirement, ok := userRequirementData.(string)
|
||
if !ok {
|
||
return nil, errors.New("参数错误:userRequirement 必须是字符串类型")
|
||
}
|
||
|
||
// 获取生成的文件列表
|
||
generatedFilesData, ok := request.GetArguments()["generatedFiles"]
|
||
if !ok {
|
||
return nil, errors.New("参数错误:generatedFiles 必须提供")
|
||
}
|
||
|
||
generatedFilesStr, ok := generatedFilesData.(string)
|
||
if !ok {
|
||
return nil, errors.New("参数错误:generatedFiles 必须是JSON字符串")
|
||
}
|
||
|
||
// 解析JSON字符串为字符串数组
|
||
var generatedFiles []string
|
||
err := json.Unmarshal([]byte(generatedFilesStr), &generatedFiles)
|
||
if err != nil {
|
||
return nil, fmt.Errorf("解析generatedFiles失败: %v", err)
|
||
}
|
||
|
||
if len(generatedFiles) == 0 {
|
||
return nil, errors.New("参数错误:generatedFiles 不能为空")
|
||
}
|
||
|
||
// 直接生成调整提示,不进行复杂分析
|
||
adjustmentPrompt := g.generateAdjustmentPrompt(userRequirement, generatedFiles)
|
||
|
||
// 构建简化的审查详情
|
||
reviewDetails := fmt.Sprintf("📋 **代码审查报告**\n\n **用户原始需求:**\n%s\n\n **已生成文件数量:** %d\n\n **建议进行代码优化和完善**", userRequirement, len(generatedFiles))
|
||
|
||
// 构建审查结果
|
||
reviewResult := &ReviewResponse{
|
||
Success: true,
|
||
Message: "代码审查完成",
|
||
AdjustmentPrompt: adjustmentPrompt,
|
||
ReviewDetails: reviewDetails,
|
||
}
|
||
|
||
// 序列化响应
|
||
responseJSON, err := json.MarshalIndent(reviewResult, "", " ")
|
||
if err != nil {
|
||
return nil, fmt.Errorf("序列化审查结果失败: %v", err)
|
||
}
|
||
|
||
return &mcp.CallToolResult{
|
||
Content: []mcp.Content{
|
||
mcp.NewTextContent(fmt.Sprintf("代码审查结果:\n\n%s", string(responseJSON))),
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
// generateAdjustmentPrompt 生成调整代码的提示
|
||
func (g *GVAReviewer) generateAdjustmentPrompt(userRequirement string, generatedFiles []string) string {
|
||
var prompt strings.Builder
|
||
|
||
prompt.WriteString("🔧 **代码调整指导 Prompt:**\n\n")
|
||
prompt.WriteString(fmt.Sprintf("**用户的原始需求为:** %s\n\n", userRequirement))
|
||
prompt.WriteString("**经过GVA生成后的文件有如下内容:**\n")
|
||
for _, file := range generatedFiles {
|
||
prompt.WriteString(fmt.Sprintf("- %s\n", file))
|
||
}
|
||
prompt.WriteString("\n")
|
||
|
||
prompt.WriteString("**请帮我优化和完善代码,确保:**\n")
|
||
prompt.WriteString("1. 代码完全满足用户的原始需求\n")
|
||
prompt.WriteString("2. 完善模块间的关联关系,确保数据一致性\n")
|
||
prompt.WriteString("3. 实现所有必要的用户交互功能\n")
|
||
prompt.WriteString("4. 保持代码的完整性和可维护性\n")
|
||
prompt.WriteString("5. 遵循GVA框架的开发规范和最佳实践\n")
|
||
prompt.WriteString("6. 确保前后端功能完整对接\n")
|
||
prompt.WriteString("7. 添加必要的错误处理和数据验证\n\n")
|
||
prompt.WriteString("8. 如果需要vue路由跳转,请使用 menu_lister获取完整路由表,并且路由跳转使用 router.push({\"name\":从menu_lister中获取的name})\n\n")
|
||
prompt.WriteString("9. 如果当前所有的vue页面内容无法满足需求,则自行书写vue文件,并且调用 menu_creator创建菜单记录\n\n")
|
||
prompt.WriteString("10. 如果需要API调用,请使用 api_lister获取api表,根据需求调用对应接口\n\n")
|
||
prompt.WriteString("11. 如果当前所有API无法满足则自行书写接口,补全前后端代码,并使用 api_creator创建api记录\n\n")
|
||
prompt.WriteString("12. 无论前后端都不要随意删除import的内容\n\n")
|
||
prompt.WriteString("**请基于用户需求和现有文件,提供完整的代码优化方案。**")
|
||
|
||
return prompt.String()
|
||
}
|