配套模板(Starter Kit)
本附录汇集配套模板,可直接复制到项目使用。覆盖 agents.md、Cursor/Claude Code 配置、Prompt 模板、Review 检查表等。
使用方式:复制下方代码块到项目对应位置,按需修改。
本指南中的"经验数据"均为经验估算,具体效果因项目而异。
快速跳转
- 1. agents.md / CLAUDE.md 模板
- 2. Cursor 配置模板
- 3. Claude Code 配置模板
- 4. OpenCode 配置模板
- 5. Prompt 模板库
- 6. Code Review 检查表
- 7. 工作流模板
- 8. 安全检查表
1. agents.md / CLAUDE.md 模板
放在项目根目录,文件名二选一:
agents.md(通用)或CLAUDE.md(Claude 工具识别)。
1.1 通用模板
markdown
# <项目名> AI Coding 协作约定
> 本文件约束 AI 工具(Cursor / Trae / Claude Code 等)的行为。
> 修改本文件属于"项目宪法变更",需要团队 Review。
- --
## 1. 项目基础
- **项目名称**:<项目名>
- **项目简介**:<一句话说明>
- **技术栈**:
- 前端:React 18 + TypeScript 5 + Vite 5
- 路由:React Router 6
- 状态:Zustand 4
- UI:Ant Design 5
- 请求:Axios + React Query
- 测试:Vitest + Testing Library
- 工具:pnpm + ESLint + Prettier
- **Node 版本**:>= 18.18
- **包管理器**:pnpm 9
## 2. 关键命令
```bash
# 安装依赖
pnpm install
# 启动开发服务器
pnpm dev
# 类型检查
pnpm typecheck
# Lint
pnpm lint
# 单元测试
pnpm test
# E2E 测试
pnpm e2e
# 构建
pnpm build
# 格式化
pnpm format3. 目录结构
src/
├── features/ # 业务特性(每个特性自包含)
│ ├── user/ # 用户模块
│ │ ├── api/ # API 调用
│ │ ├── components/ # 组件
│ │ ├── hooks/ # 自定义 Hooks
│ │ ├── store/ # 状态管理
│ │ ├── types.ts # 类型定义
│ │ └── index.ts # 模块入口
│ └── order/ # 订单模块
├── shared/ # 跨特性复用
│ ├── components/ # 通用组件
│ ├── hooks/ # 通用 hooks
│ ├── utils/ # 工具函数
│ └── types/ # 通用类型
├── pages/ # 路由页面
├── router/ # 路由配置
├── store/ # 全局状态
├── api/ # 全局 API
└── main.tsx # 应用入口4. 编码规范
命名约定
- 组件:PascalCase(如
UserProfile.tsx) - 函数/变量:camelCase(如
getUserById) - 常量:UPPER_SNAKE_CASE(如
MAX_RETRY_COUNT) - 类型/接口:PascalCase,前缀
I可选(如UserInfo或IUserInfo) - 文件名:与导出名一致
- 布尔变量:前缀
is/has/should(如isLoading)
文件组织
- 单文件 < 300 行
- 单组件 < 200 行(超过就拆子组件)
- 每个特性文件夹自包含
- 接口契约(types.ts)放在模块根
导入顺序
- 第三方包
- 内部别名(@/)
- 相对路径
typescript
// 1. 第三方
import { useState } from 'react'
import { Button } from 'antd'
// 2. 内部别名
import { useAuth } from '@/shared/hooks'
// 3. 相对路径
import { UserCard } from './UserCard'注释
- JSDoc:导出的公共函数/类型必须有
- 行内注释:解释"为什么"而非"做了什么"
- TODO:写明负责人和日期
typescript
/***根据用户 ID 获取用户信息
* @param id - 用户 ID
* @returns 用户信息
*/
export async function getUserById(id: string): Promise<User> {
// 缓存策略:使用 SWR,避免重复请求
// ...
}错误处理
- 不吞错误(不要
catch (e) {}) - 错误必须向上抛或返回有意义的错误对象
- 用户提示使用统一的 toast 组件
- 异步函数必须处理异常
typescript
// 正确
try {
const data = await fetchUser(id)
return data
} catch (error) {
logger.error('Fetch user failed', { id, error })
throw new UserFetchError('Failed to fetch user', { cause: error })
}
// 错误
try {
return await fetchUser(id)
} catch (e) {
// 吞掉错误
}异步/并发
- 优先用 async/await(不用 .then)
- 并行请求用 Promise.all
- 避免 await in loop
5. 协作约定
Git
- 分支命名:
feat/<name>、fix/<name>、chore/<name> - 提交规范:
<type>(<scope>): <subject>,参考 Conventional Commits- 类型:feat / fix / docs / style / refactor / test / chore
- 示例:
feat(user): add avatar upload
- 提交前必跑:lint + typecheck + test
- 不要提交:
node_modules/、.env、dist/、*.log、.DS_Store
分支流程
main:生产环境,永远可发布develop:开发主分支feat/*:功能分支- 合并前需要 PR + 至少 1 人 Review
PR
- 标题:与 commit 一致
- 描述:说明"为什么"+"改了什么"+"怎么测试"
- 单 PR 不超过 400 行改动
- 关联 Issue
6. AI 专属约定
AI 必须做
- 修改前先阅读相关文件
- 写代码后给出"如何测试"的说明
- 涉及多文件改动时,先列"改动清单"再动手
- 出现不确定性时主动询问
AI 不要做
- 不要修改
package.json的关键依赖版本(需人工评估) - 不要修改数据库 schema(需 DBA 评估)
- 不要删除测试代码(需确认是否过时)
- 不要直接操作生产环境(禁止 deploy、delete 等危险操作)
- 不要写 secrets 到任何文件
- 不要在未明确说明的情况下启用新依赖
AI 必须遵守
- 严格遵循本文件的命名、目录、注释规范
- 完成改动后必须能通过
pnpm typecheck+pnpm lint+pnpm test - 输出代码时同时给出"潜在风险"提示
7. 反馈
- 本文件是活的,欢迎通过 PR 改进
- 不合理的约定,由 TL Review 后调整
- 新人入门必读
1.2 极简版(适合小项目)
markdown
# <项目名> AI 约定
## 项目
- 简介:<一句话>
- 技术栈:React 18 + TypeScript + Vite
- 命令:`pnpm dev / build / test / lint / typecheck`
## 规范
- 命名:组件 PascalCase,函数 camelCase
- 文件:< 300 行/文件
- 目录:`src/features/<feature>/`
- 导入:第三方 → 别名 → 相对
## AI 约定
- 先读文件再改
- 完成后给测试说明
- 不改 package.json 关键依赖
- 不改数据库 schema
- 不写 secrets
- 不直接 deploy
## 安全
- 不要把生产数据发给 AI
- 用户输入必须校验
- 不信任 AI 返回的数据结构(要校验)
- --
## 2. Cursor 配置模板
### 2.1 旧版:.cursorrules(项目根目录)
```markdown
# Cursor 规则
## 必读
- 项目遵循 `agents.md` 的所有约定
- 修改前先看相关文件
- 完成后用 `pnpm test` 验证
## 代码风格
- 使用 TypeScript strict 模式
- 优先函数式组件
- 优先 hooks 复用
- 状态管理用 Zustand
- 表单处理用 React Hook Form
## 不要做
- 不要生成 `any` 类型
- 不要修改 .env 文件
- 不要在 .gitignore 之外创建大文件
## 上下文
- 看到 `@/shared/` 下的代码是公共组件,修改时谨慎
- 看到 `features/` 下的代码是业务特性,按特性组织
### 2.2 新版:.cursor/rules/*.mdc
新版本用分文件规则,按文件类型 / glob 匹配。
**`.cursor/rules/typescript.mdc`**:
```markdown
- --
description: TypeScript 编码规则
globs:
- "**/*.ts"
- "**/*.tsx"
- --
# TypeScript 规则
- 严格使用 `strict: true` 配置
- 禁止 `any` 类型,用 `unknown` 替代
- 导出函数必须有返回类型
- 复杂对象用 `interface`,简单对象用 `type`
- 泛型使用描述性名称(`TItem` 而非 `T`)
```typescript
// 正确
interface UserInfo {
id: string
name: string
}
function getUser(id: string): Promise<UserInfo> { ... }
// 错误
function getUser(id) { ... }.cursor/rules/react.mdc:
markdown
- --
description: React 组件规则
globs:
- "**/*.tsx"
- "**/*.jsx"
- --
# React 规则
- 函数组件优先
- 优先使用 hooks
- 组件 props 必须有 type
- 默认导出 + 命名导出都可,但保持一致
- 状态用 useState,提升到合适层级
```tsx
// 正确
interface UserCardProps {
user: User
onEdit?: (id: string) => void
}
export function UserCard({ user, onEdit }: UserCardProps) {
return (...)
}.cursor/rules/api.mdc:
markdown
- --
description: API 调用规则
globs:
- "**/api/**/*.ts"
- "**/api/**/*.tsx"
- --
# API 规则
- 用 React Query 管理请求
- 错误统一处理
- 不在前端直接处理敏感数据
- 路径用相对路径,配合 tsconfig paths
```typescript
// 正确
import { useQuery } from '@tanstack/react-query'
import { userApi } from '@/features/user/api'
export function useUser(id: string) {
return useQuery({
queryKey: ['user', id],
queryFn: () => userApi.getById(id),
})
}2.3 .cursorignore
放在项目根,告诉 Cursor 哪些文件不索引:
# 依赖
node_modules/
.pnpm-store/
# 构建产物
dist/
build/
.next/
.vite/
# 环境变量
.env
.env.local
.env.*.local
# 日志
*.log
logs/
# 大文件
*.zip
*.tar.gz
*.pdf
# 敏感信息
secrets/
credentials/
# 测试覆盖率
coverage/
# 临时文件
tmp/
temp/3. Claude Code 配置模板
3.1 CLAUDE.md(与 agents.md 二选一或并存)
如果你同时用 Claude Code 和其他工具,建议统一用 CLAUDE.md(Claude Code 优先识别)。
CLAUDE.md:
markdown
# <项目名>
## 项目
- 简介:<一句话>
- 栈:React 18 + TypeScript + Vite
- 命令:见 agents.md
## 必读
- 所有约定见 `./agents.md`
- 特别提醒:不要改 schema、不要 deploy、不要写 secrets
## Skills(可选)
- @file:./.claude/skills/review.md
- @file:./.claude/skills/test.md
### 3.2 .claudeignorenode_modules/ dist/ build/ *.log .env .env.local coverage/ .git/ .idea/ .vscode/ .DS_Store
### 3.3 Skills 示例
**`.claude/skills/review.md`**:
```markdown
- --
name: review
description: 启动代码审查流程
- --
# Code Review 流程
按以下步骤审查 PR / 文件:
1. 阅读相关测试,确认覆盖
2. 检查类型、错误处理、安全
3. 评估性能影响
4. 给出具体改进建议
输出格式:
- 优点
- 风险
- 建议
- 必须改
**`.claude/skills/test.md`**:
```markdown
- --
name: test
description: 为代码生成测试
- --
# 测试生成流程
为 <目标文件> 生成单元测试:
1. 识别导出函数
2. 覆盖 happy path
3. 覆盖边界条件(null、undefined、空数组、超大)
4. 覆盖异常路径
5. 用 describe/it 组织
6. 使用项目已有的测试工具
输出格式:
- 测试文件路径
- 关键断言说明
### 3.4 Slash Commands
**`.claude/commands/refactor.md`**:
```markdown
- --
description: 重构代码
- --
请重构 $ARGUMENTS,按以下步骤:
1. 阅读当前实现
2. 列出重构目标
3. 给出重构后代码
4. 列出风险点
5. 提供测试建议
**重要**:不破坏现有 API,不修改测试。
**`.claude/commands/security.md`**:
```markdown
- --
description: 安全审查
- --
请审查 $ARGUMENTS 的安全性:
1. 检查用户输入校验
2. 检查 SQL/XSS 风险
3. 检查认证授权
4. 检查敏感数据处理
5. 给出风险等级(高/中/低)
- --
## 4. OpenCode 配置模板
### 4.1 opencode.json
放在项目根:
```json
{
"$schema": "https://opencode.ai/config.json",
"model": "anthropic/claude-sonnet-4-6",
"provider": {
"anthropic": {
"options": {
"baseURL": "https://api.anthropic.com"
}
},
"deepseek": {
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "https://api.deepseek.com/v1"
}
}
},
"small_model": "deepseek/deepseek-chat"
}4.2 切换模型用命令
bash
# 用 Claude Sonnet 4.6
opencode --model anthropic/claude-sonnet-4-6
# 用 DeepSeek V3.2(便宜)
opencode --model deepseek/deepseek-chat
# 用 GLM-5(接近 Opus 4.6)
opencode --model zhipu/glm-55. Prompt 模板库
5.1 新功能开发
markdown
# 任务
实现"<功能名>"功能。
# 上下文
- 项目:<项目名>
- 涉及文件:<列出关键文件>
- 技术栈:<相关栈>
# 功能描述
- 输入:<用户输入/数据>
- 处理:<核心逻辑>
- 输出:<UI/API/数据>
# 验收标准
- [ ] 功能完整可用
- [ ] 边界条件已处理
- [ ] 错误处理已覆盖
- [ ] 单元测试通过(覆盖 > 80%)
- [ ] 类型检查通过
- [ ] Lint 通过
# 约束
- 不要修改 X
- 不要引入新依赖 Y
# 测试要求
- 至少 3 个测试用例
- 包含 happy path + 异常 path
### 5.2 Bug 修复
```markdown
# 现象
<具体错误信息 / 异常行为>
# 复现步骤
1. <操作 1>
2. <操作 2>
3. <出错>
# 期望
<应该是什么>
# 已尝试
- <尝试 1>(结果:失败 / 原因)
- <尝试 2>(结果:失败 / 原因)
# 相关文件
- <文件 1>(怀疑位置)
- <文件 2>(可能相关)
# 调查方向
<你的初步判断 / 假设>
### 5.3 重构
```markdown
# 重构目标
<重构后要达到什么效果>
# 范围
- 涉及文件:<清单>
- 保留不变:<明确不动的>
# 约束
- 保持 API 向后兼容
- 测试不能挂
- 不修改功能行为
- 不改数据库 schema
# 重构手法
- [ ] 提取函数
- [ ] 提取类
- [ ] 替换算法
- [ ] 移动函数
- 其他:<自定义>
# 风险评估
- 影响范围:<广/中/窄>
- 回滚方案:<git revert / feature flag>
### 5.4 Code Review 请求
```markdown
请按以下维度审查 <文件/PR>:
1. **正确性**:逻辑、边界条件
2. **性能**:时间/空间复杂度,N² 循环
3. **安全**:注入、泄露、权限
4. **可维护性**:命名、注释、复杂度
5. **测试**:覆盖、断言质量
6. **一致性**:是否与项目规范一致
输出格式:
- 必须改:<列出>
- 建议改:<列出>
- 可选优化:<列出>
- 优点:<列出>
### 5.5 测试生成
```markdown
为 <目标文件> 的 `<函数名>` 函数生成单元测试。
要求:
- 使用 Vitest + Testing Library
- 覆盖 happy path
- 覆盖边界(null、undefined、空、极大)
- 覆盖异常(throw / 拒绝)
- Mock 所有外部依赖
- 关键断言有说明
输出:
- 测试代码
- 覆盖率说明
### 5.6 文档生成
```markdown
为 <文件> 生成 JSDoc / 文档:
- 函数:参数、返回值、抛错、示例
- 类型:字段说明
- 模块:用途、依赖、用法示例
要求:
- 中文文档
- 简洁、准确
- 包含 1 个使用示例
### 5.7 架构设计讨论
```markdown
我要设计 <系统名>,请帮我思考:
# 需求
- <功能 1>
- <功能 2>
# 约束
- 性能:<QPS / 响应时间>
- 一致性:强一致 / 最终一致
- 团队规模:<人数>
# 请输出
- 整体架构(分层 / 模块)
- 关键技术选型及理由
- 风险点 + 应对方案
- MVP 拆分
- --
## 6. Code Review 检查表
### 6.1 提交者自检
提交 PR 前:
- [ ] 跑过 `pnpm typecheck` 无错误
- [ ] 跑过 `pnpm lint` 无 warning
- [ ] 跑过 `pnpm test` 全部通过
- [ ] 跑过 `pnpm format` 格式化
- [ ] 新功能有测试(覆盖 > 80%)
- [ ] 复杂逻辑有注释
- [ ] 没有遗留 console.log
- [ ] 没有提交 secrets
- [ ] 没有提交大文件
- [ ] PR 描述清楚"为什么"+"改了什么"
### 6.2 Reviewer 检查
#### 必看(5 项)
- [ ] **正确性**:逻辑正确,边界条件覆盖
- [ ] **错误处理**:不吞错,错误有上下文
- [ ] **性能**:无 N²、无内存泄漏
- [ ] **安全**:无注入、无 secrets、权限正确
- [ ] **可读性**:命名清晰、不过度抽象
#### 加分项(5 项)
- [ ] **测试质量**:断言不弱(不是 `toBeTruthy` 而应是具体值)
- [ ] **错误日志**:关键路径有日志
- [ ] **可观测性**:埋点、监控齐全
- [ ] **回滚方案**:有 feature flag 或回滚说明
- [ ] **文档更新**:API 变更、README 更新
#### 红旗(必须打回)
- 提交 secrets
- 删测试
- 跳过 typecheck / lint
- 单 PR 超过 1000 行
- 修改公共 API 无说明
- --
## 7. 工作流模板
### 7.1 Vibe Coding 工作流(30 分钟)00:00 - 05:00 需求确认(用一句话说清楚) 05:00 - 10:00 AI 生成 1-3 个 demo 10:00 - 20:00 自己评估 + AI 优化 20:00 - 25:00 决定方向(继续 / 切换 / 放弃) 25:00 - 30:00 整理产出(结论 + 经验)
### 7.2 Plan Coding 工作流(1-2 天)Day 1 上午:
- 写简短计划(任务清单 + 验收标准)
- 让 AI 拆分任务
- 估时 + 优先级
Day 1 下午:
- 实施功能
- 写测试
- 自测
Day 2:
- 修 bug
- Code Review
- 提 PR
### 7.3 Spec Coding 工作流(1-2 周)Day 1-2:需求分析
- 写功能规格(goals / scope / interfaces / acceptance)
- 团队对齐
Day 3-4:设计
- 数据模型
- 接口契约(types.ts)
- 任务拆分
Day 5-9:实施
- 按任务推进
- 每日 standup
- 持续集成
Day 10:验证
- 集成测试
- E2E 测试
- 性能测试
Day 11-12:上线
- Code Review
- 文档更新
- Feature Flag 灰度
- 监控
### 7.4 个人效率追踪
每周一花 15 分钟记录:
```markdown
# 第 X 周 AI Coding 复盘
## 本周数据
- AI 完成任务数:<N>
- 一次通过率:<X>%
- 返工率:<Y>%
- Token 消耗:<Z>
- API 成本:$ <W>
## 经验教训
- 哪些 Prompt 效果好
- 哪些反模式要避
- 哪些工具用得多
## 下周计划
- <重点 1>
- <重点 2>7.5 团队周会
每周 30 分钟,议程:
1. 分享 1 个本周 AI Coding 高光时刻(10 分钟)
2. 分享 1 个本周踩的坑(10 分钟)
3. 同步 agents.md / Cursor Rules 更新(5 分钟)
4. 度量数据 review(5 分钟)8. 安全检查表
8.1 提交前
- [ ] 代码中无 API key、token、密码
- [ ] 无 console.log 打印用户数据
- [ ] 无硬编码的 URL / IP
- [ ] 无调试代码(debugger、TODO 注释)
8.2 上线前
- [ ] 依赖审计
pnpm audit通过 - [ ] 关键路径有错误处理
- [ ] 用户输入已校验
- [ ] 权限检查到位
- [ ] HTTPS 强制
- [ ] CSP 配置正确
- [ ] 日志不包含敏感信息
- [ ] 监控告警配置
- [ ] 回滚方案就绪
8.3 数据合规
- [ ] 不向 AI 发送生产用户数据
- [ ] 测试用脱敏数据
- [ ] 内部敏感数据用本地模型
- [ ] 第三方 API 调用符合合规要求
- [ ] 留存策略符合法规
8.4 Prompt 安全
- [ ] AI 返回值校验后再使用
- [ ] AI 不直接执行 deploy / delete
- [ ] AI 不直接处理支付
- [ ] AI 不自主订阅 / 购买
- [ ] 关键决策必须人审
9. 配套文件清单
把以下文件放到项目根:
<project-root>/
├── agents.md # AI 协作约定(推荐)
├── CLAUDE.md # Claude Code 专用(可选,与 agents.md 并存)
├── .cursorrules # Cursor 旧版规则(可选)
├── .cursor/
│ └── rules/ # Cursor 新版规则(推荐)
│ ├── typescript.mdc
│ ├── react.mdc
│ └── api.mdc
├── .cursorignore # Cursor 忽略文件
├── .claude/
│ ├── skills/ # Claude Code skills
│ │ ├── review.md
│ │ └── test.md
│ └── commands/ # Claude Code slash commands
│ ├── refactor.md
│ └── security.md
├── .claudeignore # Claude Code 忽略文件
├── opencode.json # OpenCode 配置
├── .env.example # 环境变量示例
├── .gitignore # Git 忽略(已有)
└── README.md # 项目说明模板使用建议
1. 不要照搬,按需裁剪
- 小项目用"极简版 agents.md"
- 大项目用"通用模板"
- 特殊行业(金融、医疗)加额外约束
2. 团队协作
- 模板由 TL 维护
- 改动走 PR Review
- 每月回顾一次
3. 持续演进
- 团队踩坑后加到模板
- 工具能力升级后更新约定
- 业务变更后调整规范
模板元信息
- 整理时间:2026-08
- 兼容性:Cursor / Trae Solo / Claude Code / OpenCode / CodeX
- 维护建议:每季度 review 一次
模板只是起点,团队跑起来后根据实际情况调整,比"完美模板"更重要。