Skip to content

自定义工具

扩展 Qoder 功能的自定义工具开发指南。通过创建自定义工具,您可以扩展 Qoder 的核心功能,满足特定的开发需求。

工具类型

🔍 代码分析工具

  • 语法检查:定制的代码规范检查器
  • 复杂度分析:代码复杂度评估工具
  • 安全审计:漏洞和安全问题扫描
  • 性能检测:性能瓶颈和优化建议
  • 依赖分析:第三方库的安全性和许可检查

✨ 格式化工具

  • 代码格式化:自定义代码风格和格式规则
  • 导入排序:智能的导入语句整理
  • 注释生成:自动生成文档注释
  • 命名规范:统一的命名风格检查和转换

🔨 构建工具

  • 自定义构建脚本:个性化的构建流程
  • 代码生成:模板驱动的代码生成
  • 资源优化:图片、CSS、JS 的压缩和优化
  • 部署自动化:自动化的部署和发布流程

🧪 测试工具

  • 测试用例生成:基于代码逻辑的测试用例自动生成
  • Mock 数据生成:为测试自动生成模拟数据
  • 覆盖率分析:测试覆盖率统计和可视化
  • 回归测试:自动化的回归测试管理

创建自定义工具

步骤 1:定义工具配置

创建工具配置文件 tool-config.json

json
{
  "name": "代码质量检查器",
  "version": "1.0.0",
  "description": "检查代码质量和潜在问题",
  "type": "analyzer",
  "category": "code-analysis",
  "supported_languages": ["javascript", "typescript", "python", "java"],
  "file_extensions": [".js", ".ts", ".py", ".java"],
  "command": "node quality-checker.js",
  "output_format": "json",
  "settings": {
    "max_complexity": 10,
    "max_function_length": 50,
    "enforce_naming_convention": true
  },
  "dependencies": [
    "@eslint/js",
    "typescript"
  ]
}

步骤 2:实现工具逻辑

创建主工具文件 quality-checker.js

javascript
#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const { ESLint } = require('eslint');

class QualityChecker {
  constructor(config) {
    this.config = config;
    this.eslint = new ESLint({
      baseConfig: {
        rules: {
          'complexity': ['error', config.max_complexity],
          'max-lines-per-function': ['error', config.max_function_length]
        }
      }
    });
  }

  async analyzeFile(filePath) {
    try {
      const results = await this.eslint.lintFiles([filePath]);
      const issues = [];
      
      for (const result of results) {
        for (const message of result.messages) {
          issues.push({
            file: result.filePath,
            line: message.line,
            column: message.column,
            severity: message.severity === 2 ? 'error' : 'warning',
            message: message.message,
            rule: message.ruleId
          });
        }
      }
      
      return {
        success: true,
        issues: issues,
        summary: {
          total_issues: issues.length,
          errors: issues.filter(i => i.severity === 'error').length,
          warnings: issues.filter(i => i.severity === 'warning').length
        }
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  }

  async run() {
    const args = process.argv.slice(2);
    const filePath = args[0];
    
    if (!filePath) {
      console.error('错误:请提供文件路径');
      process.exit(1);
    }

    const result = await this.analyzeFile(filePath);
    console.log(JSON.stringify(result, null, 2));
  }
}

// 加载配置和运行工具
const config = require('./tool-config.json').settings;
const checker = new QualityChecker(config);
checker.run();

步骤 3:测试工具功能

创建测试文件 test-tool.js

javascript
const { execSync } = require('child_process');
const path = require('path');

// 测试文件
const testFile = path.join(__dirname, 'test-sample.js');

// 创建测试样例
const sampleCode = `
function complexFunction(a, b, c, d, e) {
  if (a > 10) {
    if (b > 20) {
      if (c > 30) {
        if (d > 40) {
          if (e > 50) {
            return a + b + c + d + e;
          }
        }
      }
    }
  }
  return 0;
}
`;

require('fs').writeFileSync(testFile, sampleCode);

try {
  // 执行工具
  const result = execSync(`node quality-checker.js ${testFile}`, { encoding: 'utf8' });
  const analysis = JSON.parse(result);
  
  console.log('✅ 工具测试成功!');
  console.log('分析结果:', analysis.summary);
  
  if (analysis.issues.length > 0) {
    console.log('检测到的问题:');
    analysis.issues.forEach(issue => {
      console.log(`  • ${issue.severity}: ${issue.message} (行 ${issue.line})`);
    });
  }
} catch (error) {
  console.error('❌ 工具测试失败:', error.message);
} finally {
  // 清理测试文件
  require('fs').unlinkSync(testFile);
}

步骤 4:集成到 Qoder

创建集成文件 qoder-integration.json

json
{
  "tool_id": "quality-checker",
  "display_name": "代码质量检查器",
  "description": "检查代码质量和潜在问题",
  "icon": "🔍",
  "shortcuts": {
    "trigger": "Ctrl+Shift+Q",
    "description": "对当前文件运行质量检查"
  },
  "integration_points": {
    "context_menu": true,
    "command_palette": true,
    "file_watcher": true,
    "save_hook": false
  },
  "output_processing": {
    "show_in_problems_panel": true,
    "highlight_issues": true,
    "auto_fix_suggestions": true
  }
}

高级功能

工具链组合

可以将多个工具组合成工作流:

json
{
  "workflow_name": "代码质量流水线",
  "description": "全面的代码质量检查流程",
  "steps": [
    {
      "tool": "syntax-checker",
      "on_success": "continue",
      "on_failure": "stop"
    },
    {
      "tool": "quality-checker",
      "on_success": "continue",
      "on_failure": "continue"
    },
    {
      "tool": "security-scanner",
      "on_success": "continue",
      "on_failure": "continue"
    },
    {
      "tool": "formatter",
      "auto_apply": true
    }
  ]
}

实时执行

配置工具在特定事件时自动执行:

json
{
  "auto_execution": {
    "on_file_save": {
      "enabled": true,
      "tools": ["formatter", "linter"]
    },
    "on_file_open": {
      "enabled": false,
      "tools": ["analyzer"]
    },
    "on_git_commit": {
      "enabled": true,
      "tools": ["quality-checker", "test-runner"]
    }
  }
}

MCP 协议集成

将自定义工具包装为 MCP 服务器:

javascript
// mcp-server.js
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');

class QualityCheckerMCPServer {
  constructor() {
    this.server = new Server(
      {
        name: 'quality-checker',
        version: '1.0.0'
      },
      {
        capabilities: {
          tools: {}
        }
      }
    );
    
    this.setupTools();
  }
  
  setupTools() {
    this.server.setRequestHandler('tools/list', async () => {
      return {
        tools: [
          {
            name: 'check_code_quality',
            description: '检查代码质量和潜在问题',
            inputSchema: {
              type: 'object',
              properties: {
                file_path: {
                  type: 'string',
                  description: '要检查的文件路径'
                }
              },
              required: ['file_path']
            }
          }
        ]
      };
    });
    
    this.server.setRequestHandler('tools/call', async (request) => {
      const { name, arguments: args } = request.params;
      
      if (name === 'check_code_quality') {
        const checker = new QualityChecker(this.config);
        const result = await checker.analyzeFile(args.file_path);
        
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(result, null, 2)
            }
          ]
        };
      }
      
      throw new Error(`未知工具: ${name}`);
    });
  }
  
  async run() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
  }
}

const server = new QualityCheckerMCPServer();
server.run();

最佳实践

1. 工具设计原则

  • 单一职责:每个工具只做一件事,但要做好
  • 可组合性:设计成可以与其他工具组合使用
  • 错误处理:提供清晰的错误信息和恢复建议
  • 性能优化:考虑大型项目的性能表现

2. 配置管理

  • 使用 JSON Schema 验证配置文件
  • 提供默认配置和用户自定义配置
  • 支持环境变量和命令行参数
  • 实现配置热更新功能

3. 测试和调试

  • 编写单元测试和集成测试
  • 提供详细的日志和调试信息
  • 使用模拟数据进行测试
  • 实现性能基准测试

4. 文档和发布

  • 编写详细的使用说明和 API 文档
  • 提供实际的使用示例和最佳实践
  • 实现版本管理和变更日志
  • 提供简单的安装和更新机制

通过开发自定义工具,您可以将 Qoder 打造成为真正符合您的开发需求的智能编程平台。

📚 Qoder 中文学习指南 - 非官方文档站点 | 每天都有新发现 🎆