Project Rules
使用 Project rules 来让 Agent 遵守项目规则,确保 Agent 的行为符合项目要求。
比如说,我想要 Agent 自动提交代码的时候,能够按照一定规则来生成 Commit Message,我们可以利用 Agent 平台提供的规则来实现。
在 Agent 中,可以使用 Cmd + Shift + P 来开启命令窗口,然后输入 New Cursor Rule 来创建规则。
以下是一个 Commit message 的 rule 样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| --- alwaysApply: true ---
# GIT 提交说明
提交的 Commit message 必须遵循以下格式:
**格式:** `[标签]分类:具体描述` 或 `[标签]具体描述`
**说明:** 分类为可选项,可根据实际情况添加
## 标签类型
- `feature` - 新功能 - `bugfix` - 错误修复 - `docs` - 文档修改 - `style` - 样式调整(代码格式、UI 样式等) - `refactor` - 代码重构(不改变功能) - `perf` - 性能优化 - `test` - 测试相关 - `chore` - 构建配置、依赖更新等
## 常见分类
- 工程初始化 - 配置优化 - 功能开发 - 样式调整 - 文档更新 - 性能优化 - 代码重构
## 样例
- `[feature]工程初始化:增加基础配置` - `[feature]工程初始化:增加必要的资源` - `[bugfix]配置优化:修复无法打包的问题` - `[feature]功能开发:实现用户登录功能` - `[bugfix]样式调整:修复移动端布局错位` - `[docs]文档更新:更新 README 使用说明` - `[style]样式调整:优化首页布局` - `[refactor]代码重构:抽取公共组件` - `[perf]性能优化:优化图片加载速度` - `[chore]依赖更新:升级 hexo 版本`
|
你可以根据自己的情况来确定生效时机,目前 Cursor 支持:
由于规则是会占用 token 数量, 所以建议走智能生效的形式,即让 Agent 自行决定是否启用该规则
知识库
知识库(Knowledge Base)是 Agent 理解项目上下文的重要工具。通过构建和维护知识库,可以让 Agent 更好地理解项目架构、业务逻辑和开发规范。
知识库的作用
- 项目理解:帮助 Agent 快速了解项目结构和技术栈
- 代码生成:基于项目规范生成符合要求的代码
- 问题解答:回答项目相关的技术问题
- 文档生成:自动生成 API 文档、使用说明等
如何构建知识库
1. 代码分析
让 Agent 分析项目代码,提取关键信息:
1 2 3 4 5
| 请分析这个项目的架构,包括: - 技术栈和框架 - 目录结构 - 核心模块和功能 - 设计模式和最佳实践
|
2. 文档整理
将项目文档、README、设计文档等整理成结构化的知识库内容。
3. 知识库模板
创建知识库模板,定义标准格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 项目概述 - 项目名称:xxx - 技术栈:xxx - 主要功能:xxx
# 架构设计 - 前端:xxx - 后端:xxx - 数据库:xxx
# 开发规范 - 代码风格:xxx - 命名规范:xxx - 提交规范:xxx
|
使用建议
- 定期更新:随着项目演进,及时更新知识库内容
- 分类管理:按模块、功能分类组织知识库
- 版本控制:将知识库纳入版本管理,追踪变更历史
MCP
MCP(Model Context Protocol)是连接 Agent 和外部工具的标准协议。通过 MCP,Agent 可以调用外部 API、访问数据库、执行系统命令等,大大扩展了 Agent 的能力边界。
MCP 的优势
- 能力扩展:让 Agent 访问外部资源和工具
- 标准化:统一的协议规范,易于集成
- 安全性:可控的权限管理
- 灵活性:支持自定义实现
自行实现 MCP
基本结构
MCP 服务通常包含以下组件:
- Server:MCP 服务器,处理 Agent 的请求
- Tools:定义可用的工具和操作
- Resources:提供可访问的资源
- Prompts:预定义的提示模板
实现示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new Server({ name: 'my-mcp-server', version: '1.0.0', });
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ { name: 'get_weather', description: '获取指定城市的天气信息', inputSchema: { type: 'object', properties: { city: { type: 'string' } } } } ] }));
server.setRequestHandler(CallToolRequestSchema, async (request) => { if (request.params.name === 'get_weather') { const city = request.params.arguments?.city; return { content: [{ type: 'text', text: '天气信息...' }] }; } });
|
部署和配置
- 开发 MCP 服务:按照 MCP 协议实现服务端
- 配置 Agent:在 Agent 配置中添加 MCP 服务器地址
- 测试验证:确保工具调用正常工作
三方 MCP
常用 MCP 服务
- GitHub MCP:访问 GitHub API,管理仓库、Issues、PR 等
- Database MCP:连接数据库,执行查询和操作
- File System MCP:文件系统操作,读写文件
- Web Search MCP:网络搜索功能
- API MCP:调用任意 REST API
使用方式
- 安装 MCP 服务:通过包管理器或直接安装
- 配置连接:在 Agent 配置中指定 MCP 服务器
- 调用工具:Agent 可以自动识别并使用 MCP 提供的工具
示例:GitHub MCP
1 2 3 4 5 6 7 8
| mcp_servers: github: url: "https://mcp.github.com" tools: - create_issue - list_repositories - create_pull_request
|
Agent 可以直接使用这些工具:
1
| 请帮我创建一个新的 Issue,标题是"优化性能"
|
组合知识库和 MCP 实现自动化分析
知识库和 MCP 可以完美结合,实现强大的自动化分析能力。知识库提供项目上下文,MCP 提供外部工具能力,两者结合可以完成复杂的分析任务。
应用场景
1. 代码质量分析
流程:
- 知识库提供代码规范和最佳实践
- MCP 调用代码分析工具(如 ESLint、SonarQube)
- Agent 结合两者生成分析报告
示例:
1 2 3 4 5
| 基于项目知识库中的代码规范,使用 MCP 工具分析当前代码, 生成代码质量报告,包括: - 代码规范检查结果 - 潜在问题和建议 - 性能优化建议
|
2. 依赖分析
流程:
- 知识库记录项目依赖和版本要求
- MCP 调用包管理器 API 检查依赖
- Agent 分析依赖关系和安全漏洞
示例:
1 2
| 检查项目依赖,对比知识库中的版本要求, 识别过时依赖和安全漏洞,生成升级建议
|
3. 文档自动生成
流程:
- 知识库提供文档模板和规范
- MCP 读取代码和注释
- Agent 生成符合规范的文档
示例:
1 2
| 基于知识库中的 API 文档模板,使用 MCP 读取代码注释, 自动生成完整的 API 文档
|
最佳实践
- 知识库优先:先建立完善的知识库,提供上下文基础
- MCP 补充:使用 MCP 获取实时数据和执行操作
- 迭代优化:根据分析结果不断优化知识库内容
- 权限控制:合理设置 MCP 工具权限,确保安全性
Template
Template(模板)是 Agent 代码生成的核心工具。通过定义代码模板,可以确保生成的代码符合项目规范,提高代码质量和一致性。
Template 的优势
- 一致性:确保生成的代码风格统一
- 效率:快速生成符合规范的代码
- 可维护性:模板集中管理,易于更新
- 复用性:一次定义,多次使用
Template 类型
1. 代码模板
定义常用代码片段的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import React from 'react';
interface {{ComponentName}}Props { }
export const {{ComponentName}}: React.FC<{{ComponentName}}Props> = (props) => { return ( <div className="{{component-name}}"> {/* 组件内容 */} </div> ); };
|
2. 文件模板
定义完整文件的模板结构:
1 2 3 4 5 6 7 8 9 10 11
| # template: api-endpoint.ts import { Request, Response } from 'express';
export const {{endpointName}} = async (req: Request, res: Response) => { try { // 业务逻辑 res.json({ success: true, data: {} }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } };
|
3. 项目结构模板
定义项目初始化模板:
1 2 3 4 5 6 7
| project-template/ ├── src/ │ ├── components/ │ ├── utils/ │ └── types/ ├── tests/ └── docs/
|
使用方式
1. 创建模板
在项目中创建 .cursor/templates/ 目录,存放模板文件:
1 2 3 4 5
| .cursor/ └── templates/ ├── component.tsx.template ├── api.ts.template └── test.ts.template
|
2. 模板变量
使用 {{变量名}} 定义可替换的变量:
1 2 3 4 5 6 7 8
| export class {{ClassName}} { private {{propertyName}}: {{Type}}; constructor({{propertyName}}: {{Type}}) { this.{{propertyName}} = {{propertyName}}; } }
|
3. 调用模板
Agent 可以根据上下文自动选择合适的模板:
1
| 请创建一个用户管理组件,使用 React 和 TypeScript
|
Agent 会:
- 识别需要使用组件模板
- 提取变量(组件名、属性等)
- 填充模板生成代码
模板管理
1. 版本控制
将模板纳入版本管理,追踪变更:
1 2
| git add .cursor/templates/ git commit -m "[docs]添加新的组件模板"
|
2. 分类组织
按功能、类型分类组织模板:
1 2 3 4 5 6 7 8
| templates/ ├── frontend/ │ ├── react/ │ └── vue/ ├── backend/ │ ├── express/ │ └── nestjs/ └── common/
|
3. 文档说明
为每个模板添加说明文档:
1 2 3 4 5 6
| # component.tsx.template
用途:生成 React 函数组件 变量: - ComponentName: 组件名称(PascalCase) - component-name: CSS 类名(kebab-case)
|
最佳实践
- 保持简洁:模板不要过于复杂,保持可读性
- 参数化:将可变部分提取为变量
- 文档化:为模板添加清晰的说明
- 测试验证:确保模板生成的代码可以正常运行
- 定期更新:随着项目演进,及时更新模板
示例:完整的组件模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import React, { useState, useEffect } from 'react'; import './{{ComponentName}}.css';
export const {{ComponentName}}: React.FC<{{ComponentName}}Props> = (props) => { const [state, setState] = useState<{{StateType}}>({{initialState}});
useEffect(() => { }, []);
return ( <div className="{{component-name}}" data-testid="{{component-name}}"> {/* 组件内容 */} </div> ); };
export default {{ComponentName}};
|
通过合理使用 Template,可以大幅提升代码生成效率和质量。