Skip to main content
Glama
DEVELOPMENT.zh.md10.5 kB
# 开发指南 本指南涵盖设置开发环境、构建项目、贡献代码以及理解 Spec Workflow MCP 的架构。 ## 前置要求 ### 必需软件 - **Node.js** 18.0 或更高版本 - **npm** 9.0 或更高版本 - **Git** 用于版本控制 - **TypeScript** 知识有帮助 ### 推荐工具 - **VSCode** 带 TypeScript 扩展 - **Chrome/Edge DevTools** 用于仪表板调试 - **Postman/Insomnia** 用于 API 测试 ## 设置开发环境 ### 1. 克隆仓库 ```bash git clone https://github.com/Pimzino/spec-workflow-mcp.git cd spec-workflow-mcp ``` ### 2. 安装依赖 ```bash npm install ``` 这将安装: - MCP SDK - TypeScript 和构建工具 - Express 用于仪表板服务器 - WebSocket 库 - 测试框架 ### 3. 构建项目 ```bash npm run build ``` 这将把 TypeScript 文件编译为 `dist/` 目录中的 JavaScript。 ## 开发命令 ### 核心命令 | 命令 | 描述 | |---------|-------------| | `npm run dev` | 以开发模式启动,支持自动重载 | | `npm run build` | 构建生产包 | | `npm start` | 运行生产服务器 | | `npm test` | 运行测试套件 | | `npm run clean` | 删除构建产物 | | `npm run lint` | 运行代码检查器 | | `npm run format` | 使用 Prettier 格式化代码 | ### 开发模式 ```bash npm run dev ``` 功能: - 文件更改时自动重新编译 - 仪表板热重载 - 详细错误消息 - 调试用的 Source maps ### 生产构建 ```bash npm run clean && npm run build ``` 优化: - 压缩的 JavaScript - 优化的包大小 - 生产错误处理 - 性能改进 ## 项目结构 ``` spec-workflow-mcp/ ├── src/ # 源代码 │ ├── index.ts # MCP 服务器入口点 │ ├── server.ts # 仪表板服务器 │ ├── tools/ # MCP 工具实现 │ ├── prompts/ # 提示模板 │ ├── utils/ # 实用函数 │ └── types/ # TypeScript 类型定义 ├── dist/ # 编译的 JavaScript ├── dashboard/ # Web 仪表板文件 │ ├── index.html # 仪表板 UI │ ├── styles.css # 仪表板样式 │ └── script.js # 仪表板 JavaScript ├── vscode-extension/ # VSCode 扩展 │ ├── src/ # 扩展源代码 │ └── package.json # 扩展清单 ├── tests/ # 测试文件 ├── docs/ # 文档 └── package.json # 项目配置 ``` ## 架构概述 ### MCP 服务器架构 ``` 客户端 (AI) ↔ MCP 协议 ↔ 服务器 ↔ 文件系统 ↓ 仪表板 ``` ### 关键组件 #### 1. MCP 服务器(`src/index.ts`) - 处理 MCP 协议通信 - 处理工具请求 - 管理项目状态 - 文件系统操作 #### 2. 仪表板服务器(`src/server.ts`) - 提供 Web 仪表板服务 - WebSocket 连接 - 实时更新 - HTTP API 端点 #### 3. 工具(`src/tools/`) 每个工具都是一个独立模块: - 输入验证 - 业务逻辑 - 文件操作 - 响应格式化 #### 4. 提示(`src/prompts/`) 用于以下的模板字符串: - 文档生成 - 工作流程指导 - 错误消息 - 用户说明 ## 实现新功能 ### 添加新工具 1. **在 `src/tools/` 中创建工具文件**: ```typescript // src/tools/my-new-tool.ts import { Tool } from '@anthropic/mcp-sdk'; export const myNewTool: Tool = { name: 'my-new-tool', description: '工具功能描述', parameters: { type: 'object', properties: { param1: { type: 'string', description: '参数描述' }, param2: { type: 'number', optional: true } }, required: ['param1'] }, handler: async (params) => { // 工具实现 const { param1, param2 = 0 } = params; // 业务逻辑在这里 return { success: true, data: '工具响应' }; } }; ``` 2. **在索引中注册**(`src/tools/index.ts`): ```typescript export { myNewTool } from './my-new-tool'; ``` 3. **添加到服务器**(`src/index.ts`): ```typescript import { myNewTool } from './tools'; server.registerTool(myNewTool); ``` ### 添加仪表板功能 1. **更新 HTML**(`dashboard/index.html`): ```html <div class="new-feature"> <h3>新功能</h3> <button id="new-action">操作</button> </div> ``` 2. **添加 JavaScript**(`dashboard/script.js`): ```javascript document.getElementById('new-action').addEventListener('click', () => { // 功能逻辑 ws.send(JSON.stringify({ type: 'new-action', data: { /* ... */ } })); }); ``` 3. **在服务器中处理**(`src/server.ts`): ```typescript ws.on('message', (message) => { const { type, data } = JSON.parse(message); if (type === 'new-action') { // 处理新操作 } }); ``` ## 测试 ### 运行测试 ```bash # 运行所有测试 npm test # 运行特定测试文件 npm test -- src/tools/my-tool.test.ts # 运行覆盖率测试 npm run test:coverage # 监视模式 npm run test:watch ``` ### 编写测试 在源文件旁边创建测试文件: ```typescript // src/tools/my-tool.test.ts import { describe, it, expect } from 'vitest'; import { myTool } from './my-tool'; describe('myTool', () => { it('应正确处理输入', async () => { const result = await myTool.handler({ param1: 'test' }); expect(result.success).toBe(true); expect(result.data).toContain('expected'); }); it('应处理错误', async () => { const result = await myTool.handler({ param1: null }); expect(result.success).toBe(false); expect(result.error).toBeDefined(); }); }); ``` ### 集成测试 测试完整的工作流程: ```typescript // tests/integration/workflow.test.ts describe('完整工作流程', () => { it('应从头到尾创建规格', async () => { // 创建需求 // 批准需求 // 创建设计 // 批准设计 // 创建任务 // 验证结构 }); }); ``` ## 调试 ### 调试 MCP 服务器 1. **添加调试输出**: ```typescript console.error('[DEBUG]', '工具被调用:', toolName, params); ``` 2. **使用 VSCode 调试器**: ```json // .vscode/launch.json { "type": "node", "request": "launch", "name": "调试 MCP 服务器", "program": "${workspaceFolder}/dist/index.js", "args": ["/path/to/test/project"], "console": "integratedTerminal" } ``` ### 调试仪表板 1. **浏览器 DevTools**: - 在浏览器中打开仪表板 - 按 F12 打开 DevTools - 检查控制台中的错误 - 监控网络标签中的 WebSocket 2. **添加日志**: ```javascript console.log('WebSocket 消息:', message); console.log('状态更新:', newState); ``` ## 代码风格和标准 ### TypeScript 指南 - 使用严格模式 - 为数据结构定义接口 - 避免使用 `any` 类型 - 使用 async/await 而不是回调 ### 文件组织 - 每个文件一个组件 - 分组相关功能 - 清晰的命名约定 - 全面的注释 ### 命名约定 - **文件**:kebab-case(`my-tool.ts`) - **类**:PascalCase(`SpecManager`) - **函数**:camelCase(`createSpec`) - **常量**:UPPER_SNAKE(`MAX_RETRIES`) ## 贡献 ### 贡献流程 1. **Fork 仓库** 2. **创建功能分支**: ```bash git checkout -b feature/my-feature ``` 3. **进行更改** 4. **编写测试** 5. **运行测试和代码检查**: ```bash npm test npm run lint ``` 6. **提交更改**: ```bash git commit -m "feat: add new feature" ``` 7. **推送分支**: ```bash git push origin feature/my-feature ``` 8. **创建 Pull Request** ### 提交消息格式 遵循约定式提交: - `feat:` 新功能 - `fix:` 错误修复 - `docs:` 文档 - `style:` 格式化 - `refactor:` 代码重构 - `test:` 测试 - `chore:` 维护 示例: ``` feat: add approval revision workflow fix: resolve dashboard WebSocket reconnection issue docs: update configuration guide ``` ### Pull Request 指南 - 清晰的描述 - 引用相关问题 - 包含 UI 更改的截图 - 确保所有测试通过 - 更新文档 ## 发布 ### NPM 包 1. **更新版本**: ```bash npm version patch|minor|major ``` 2. **构建包**: ```bash npm run build ``` 3. **发布**: ```bash npm publish ``` ### VSCode 扩展 1. **更新扩展版本**,在 `vscode-extension/package.json` 中 2. **构建扩展**: ```bash cd vscode-extension npm run package ``` 3. **发布到市场**: ```bash vsce publish ``` ## 性能优化 ### 服务器性能 - 对文件读取使用缓存 - 为文件监视器实现防抖 - 优化 WebSocket 消息批处理 - 延迟加载大型文档 ### 仪表板性能 - 最小化 DOM 更新 - 对长列表使用虚拟滚动 - 实现渐进式渲染 - 优化 WebSocket 重连 ## 安全考虑 ### 输入验证 始终验证工具输入: ```typescript if (!params.specName || typeof params.specName !== 'string') { throw new Error('无效的规格名称'); } // 清理文件路径 const safePath = path.normalize(params.path); if (safePath.includes('..')) { throw new Error('无效的路径'); } ``` ### 文件系统安全 - 将操作限制在项目目录内 - 验证所有文件路径 - 使用安全的文件操作 - 实现权限检查 ## 开发问题故障排除 ### 常见构建错误 | 错误 | 解决方案 | |-------|----------| | TypeScript 错误 | 运行 `npm run build` 查看详细错误 | | 找不到模块 | 检查导入并运行 `npm install` | | 端口已被使用 | 更改端口或终止现有进程 | | WebSocket 连接失败 | 检查服务器是否运行且端口正确 | ### 开发技巧 1. **使用 TypeScript 严格模式**以获得更好的类型安全 2. **启用 source maps**以便更容易调试 3. **使用 nodemon**在开发期间自动重启 4. **在隔离目录中测试**文件操作 5. **使用 Chrome DevTools 监控**性能 ## 资源 - [MCP SDK 文档](https://github.com/anthropics/mcp-sdk) - [TypeScript 手册](https://www.typescriptlang.org/docs/) - [Node.js 最佳实践](https://github.com/goldbergyoni/nodebestpractices) - [VSCode 扩展 API](https://code.visualstudio.com/api) ## 相关文档 - [配置指南](CONFIGURATION.zh.md) - 服务器配置 - [用户指南](USER-GUIDE.zh.md) - 使用服务器 - [工具参考](TOOLS-REFERENCE.zh.md) - 工具文档 - [故障排除](TROUBLESHOOTING.zh.md) - 常见问题

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Pimzino/spec-workflow-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server