Files
FastGPT/.claude/skills/system-pr_review/code-quality-standards.md
T
Archer 76d6234de6 V4.14.7 features (#6406)
* Agent features (#6345)

* Test agent (#6220)

* squash: compress all commits into one

* feat: plan response in ui

* response ui

* perf: agent config

* merge

* tool select ux

* perf: chat ui

* perf: agent editform

* tmp code

* feat: save chat

* Complete agent parent  (#6049)

* add role and tools filling

* add: file-upload

---------

Co-authored-by: xxyyh <2289112474@qq>

* perf: top agent code

* top agent (#6062)

Co-authored-by: xxyyh <2289112474@qq>

* fix: ts

* skill editor ui

* ui

* perf: rewrite type with zod

* skill edit ui

* skill agent (#6089)

* cp skill chat

* rebase fdf933d
 and add skill chat

* 1. skill 的 CRUD
2. skill 的信息渲染到前端界面

* solve comment

* remove chatid and chatItemId

* skill match

* perf: skill manage

* fix: ts

---------

Co-authored-by: xxyyh <2289112474@qq>
Co-authored-by: archer <545436317@qq.com>

* fix: ts

* fix: loop import

* skill tool config (#6114)

Co-authored-by: xxyyh <2289112474@qq>

* feat: load tool in agent

* skill memory (#6126)

Co-authored-by: xxyyh <2289112474@qq>

* perf: agent skill editor

* perf: helperbot ui

* agent code

* perf: context

* fix: request context

* agent usage

* perf: agent context and pause

* perf: plan response

* Test agent sigle skill (#6184)

* feat:top box fill

* prompt fix

---------

Co-authored-by: xxyyh <2289112474@qq>

* perf: agent chat ui

* Test agent new (#6219)

* have-replan

* agent

---------

Co-authored-by: xxyyh <2289112474@qq>

* fix: ts

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: xxyyh <2289112474@qq>

* feat: consolidate agent and MCP improvements

This commit consolidates 17 commits including:
- MCP tools enhancements and fixes
- Agent system improvements and optimizations
- Auth limit and prompt updates
- Tool response compression and error tracking
- Simple app adaptation
- Code quality improvements (TypeScript, ESLint, Zod)
- Version type migration to schema
- Remove deprecated useRequest2
- Add LLM error tracking
- Toolset ID validation fixes

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: xxyyh <2289112474@qq>

* fix: transform avatar copy;perf: filter invalid tool

* update llm response storage time

* fix: openapi schema

* update skill desc

* feat: cache hit data

* i18n

* lock

* chat logs support error filter & user search (#6373)

* chat log support searching by user name

* support error filter

* fix

* fix overflow

* optimize

* fix init script

* fix

* perf: get log users

* updat ecomment

* fix: ts

* fix: test

---------

Co-authored-by: archer <545436317@qq.com>

* Fix: agent  (#6376)

* Agent features (#6345)

* Test agent (#6220)

* squash: compress all commits into one

* feat: plan response in ui

* response ui

* perf: agent config

* merge

* tool select ux

* perf: chat ui

* perf: agent editform

* tmp code

* feat: save chat

* Complete agent parent  (#6049)

* add role and tools filling

* add: file-upload

---------

Co-authored-by: xxyyh <2289112474@qq>

* perf: top agent code

* top agent (#6062)

Co-authored-by: xxyyh <2289112474@qq>

* fix: ts

* skill editor ui

* ui

* perf: rewrite type with zod

* skill edit ui

* skill agent (#6089)

* cp skill chat

* rebase fdf933d
 and add skill chat

* 1. skill 的 CRUD
2. skill 的信息渲染到前端界面

* solve comment

* remove chatid and chatItemId

* skill match

* perf: skill manage

* fix: ts

---------

Co-authored-by: xxyyh <2289112474@qq>
Co-authored-by: archer <545436317@qq.com>

* fix: ts

* fix: loop import

* skill tool config (#6114)

Co-authored-by: xxyyh <2289112474@qq>

* feat: load tool in agent

* skill memory (#6126)

Co-authored-by: xxyyh <2289112474@qq>

* perf: agent skill editor

* perf: helperbot ui

* agent code

* perf: context

* fix: request context

* agent usage

* perf: agent context and pause

* perf: plan response

* Test agent sigle skill (#6184)

* feat:top box fill

* prompt fix

---------

Co-authored-by: xxyyh <2289112474@qq>

* perf: agent chat ui

* Test agent new (#6219)

* have-replan

* agent

---------

Co-authored-by: xxyyh <2289112474@qq>

* fix: ts

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: xxyyh <2289112474@qq>

* feat: consolidate agent and MCP improvements

This commit consolidates 17 commits including:
- MCP tools enhancements and fixes
- Agent system improvements and optimizations
- Auth limit and prompt updates
- Tool response compression and error tracking
- Simple app adaptation
- Code quality improvements (TypeScript, ESLint, Zod)
- Version type migration to schema
- Remove deprecated useRequest2
- Add LLM error tracking
- Toolset ID validation fixes

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: xxyyh <2289112474@qq>

* 1. 把辅助生成前端上的 system prompt 加入到上下文中
2. mcp工具的前端渲染(图标)
3. 文件读取工具和文件上传进行关联
4. 添加了辅助生成返回格式出错的重试方案
5. ask 不出现在 plan 步骤中
6. 添加了辅助生成的头像和交互 UI

* fix:read_file

* helperbot ui

* ts error

* helper ui

* delete Unused import

* perf: helper bot

* lock

---------

Co-authored-by: Archer <545436317@qq.com>
Co-authored-by: xxyyh <2289112474@qq>

* fix date variable required & model auth (#6386)

* fix date variable required & model auth

* doc

* feat: add chat id to finish callback

* fix: iphone safari shareId (#6387)

* fix: iphone safari shareId

* fix: mcp file list can't setting

* fix: reason output field

* fix: skip JSON validation for HTTP tool body with variable (#6392)

* fix: skip JSON validation for HTTP tool body with variable

* doc

* workflow fitview

* perf: selecting memory

* perf: cp api

* ui

* perf: toolcall auto adapt

* fix: catch workflow error

* fix: ts

* perf: pagination type

* remove

* ignore

* update doc

* fix: simple app tool select

* add default avatar to logs user

* perf: loading user

* select dataset ui

* rename version

* feat: add global/common test

* perf: packages/global/common test

* feat: package/global/ai,app test

* add global/chat test

* global/core test

* global/core test

* feat: packages/global all test

* perf: test

* add server api test

* perf: init shell

* perf: init4150 shell

* remove invalid code

* update doc

* remove log

* fix: chat effect

* fix: plan fake tool  (#6398)

* 1. 提示词防注入功能
2. 无工具不进入 plan,防止虚拟工具生成

* Agent-dataset

* dataset

* dataset presetInfo

* prefix

* perf: prompt

---------

Co-authored-by: xxyyh <2289112474@qq>
Co-authored-by: archer <545436317@qq.com>

* fix: review

* adapt kimi2.5 think toolcall

* feat: invoke fastgpt user info (#6403)

feat: invoke fastgpt user info

* fix: invoke fastgpt user info return orgs (#6404)

* skill and version

* retry helperbot (#6405)

Co-authored-by: xxyyh <2289112474@qq>

* update template

* remove log

* doc

* update doc

* doc

* perf: internal ip check

* adapt get paginationRecords

* tool call adapt

* fix: test

* doc

* fix: agent initial version

* adapt completions v1

* feat: instrumentation check

* rename skill

* add workflow demo mode tracks (#6407)

* chore: 统一 skills 目录命名为小写

将 .claude/Skills/ 重命名为 .claude/skills/ 以保持命名一致性。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* add workflow demo mode tracks

* code

* optimize

* fix: improve workflowDemoTrack based on PR review

- Add comment to empty catch block for maintainability
- Add @param docs to onDemoChange clarifying nodeCount usage
- Replace silent .catch with console.debug for dev debugging
- Handle appId changes by reporting old data before re-init

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: archer <545436317@qq.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* remove repeat skill

* fix(workflow): filter out orphan edges to prevent runtime errors (#6399)

* fix(workflow): filter out orphan edges to prevent runtime errors

Runtime edges that reference non-existent nodes (orphan edges) can cause
unexpected behavior or crashes during workflow dispatch. This change adds
a pre-check to filter out such edges before execution begins, ensuring
system stability even with inconsistent graph data.

* fix(workflow): enhance orphan edge filtering with logging and tests

- Refactor: Extract logic to 'filterOrphanEdges' in utils.ts for better reusability
- Feat: Add performance monitoring (warn if >100ms) and comprehensive logging
- Feat: Support detailed edge inspection in debug mode
- Docs: Add JSDoc explaining causes of orphan edges (migration, manual edits)
- Test: Add unit tests covering edge cases and performance (1000 edges)

Addresses PR review feedback regarding logging, variable naming, and testing."

* move code

* move code

* add more unit test

---------

Co-authored-by: archer <545436317@qq.com>

* test

* perf: test

* add server/common/string test

* fix: resolve $ref references in MCP tool input schemas (#6395) (#6409)

* fix: resolve $ref references in MCP tool input schemas (#6395)

* add test code

---------

Co-authored-by: archer <545436317@qq.com>

* chore(docs): add fastgpt, fastgpt-plugin version choice guide (#6411)

* chore(doc): add fastgpt version description

* doc

* doc

---------

Co-authored-by: archer <545436317@qq.com>

* fix:dataset cite and description info (#6410)

* 1. 添加知识库引用(plan 步骤和直接知识库调用)
2. 提示词框中的@知识库工具
3. plan 中 step 的 description dataset_search 改为中文

* fix: i18n

* prompt

* prompt

---------

Co-authored-by: xxyyh <2289112474@qq>

* fix: tool call

* perf: workflow props

* fix: merge ECharts toolbox options instead of overwriting (#6269) (#6412)

* feat: integrate logtape and otel (#6400)

* fix: deps

* feat(logger): integrate logtape and otel

* wip(log): add basic infras logs

* wip(log): add request id and inject it into context

* wip(log): add basic tx logs

* wip(log): migrate

* wip(log): category

* wip(log): more sub category

* fix: type

* fix: sessionRun

* fix: export getLogger from client.ts

* chore: improve logs

* docs: update signoz and changelog

* change type

* fix: ts

* remove skill.md

* fix: lockfile specifier

* fix: test

---------

Co-authored-by: archer <545436317@qq.com>

* init log

* doc

* remove invalid log

* fix: review

* template

* replace new log

* fix: ts

* remove log

* chore: migrate all addLog to logtape

* move skill

* chore: migrate all addLog to logtape (#6417)

* update skill

* remove log

* fix: tool check

---------

Co-authored-by: YeYuheng <57035043+YYH211@users.noreply.github.com>
Co-authored-by: xxyyh <2289112474@qq>
Co-authored-by: heheer <heheer@sealos.io>
Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: xuyafei1996 <54217479+xuyafei1996@users.noreply.github.com>
Co-authored-by: ToukoYui <2331631097@qq.com>
Co-authored-by: roy <whoeverimf5@gmail.com>
2026-02-12 16:37:50 +08:00

15 KiB

维度 1: 代码质量标准

通用的代码质量标准,适用于所有项目。这些标准关注代码的正确性、安全性、性能和可维护性。

目录


1. 安全性标准

1.1 输入验证 🔴 必须检查

原则: 永远不要信任用户输入,所有输入必须验证

检查清单:

  • 所有用户输入都经过验证和清理
  • 文件上传验证类型、大小、扩展名
  • URL 参数和查询参数验证
  • 使用白名单而不是黑名单
  • 数组/对象参数验证长度和结构

示例:

// ❌ 不安全: 直接使用用户输入
async function searchUsers(query: string) {
  return await db.users.find({ name: query });
}

// ✅ 安全: 验证和清理输入
async function searchUsers(query: string): Promise<User[]> {
  // 验证输入
  if (!query || query.length > 100) {
    throw new Error('Invalid query parameter');
  }

  // 清理输入: 移除特殊字符
  const sanitizedQuery = query.replace(/[^\w\s]/g, '');

  return await db.users
    .find({
      name: { $regex: sanitizedQuery, $options: 'i' }
    })
    .limit(10)  // 限制结果数量
    .toArray();
}

1.2 权限检查 🔴 必须检查

原则: 所有需要授权的操作都必须验证用户权限

检查清单:

  • 所有 API 路由都有权限验证
  • 验证用户对资源的所有权
  • 敏感操作需要额外验证 (2FA, 确认密码)
  • 遵循最小权限原则

示例:

// ❌ 不安全: 没有权限验证
export default async function handler(req: NextAPIRequest, res: NextAPIResponse) {
  const userId = req.body.userId;
  const user = await db.users.findById(userId);
  res.json(user);
}

// ✅ 安全: 验证权限
import { parseHeaderCert } from '@fastgpt/global/support/permission/controller';

export default async function handler(req: NextAPIRequest, res: NextAPIResponse) {
  // 1. 验证身份
  const { userId: authUserId } = await parseHeaderCert(req);

  // 2. 验证权限 (只能访问自己的数据)
  const requestedUserId = req.body.userId;

  // 管理员可以访问所有用户,普通用户只能访问自己
  if (authUserId !== requestedUserId && !isAdmin(authUserId)) {
    throw new Error('Permission denied');
  }

  const user = await db.users.findById(requestedUserId);

  // 3. 过滤敏感字段
  const { password, ...safeUser } = user;
  res.json(safeUser);
}

1.3 注入防护 🔴 必须检查

原则: 防止 SQL/NoSQL 注入、命令注入、XSS 等攻击

检查清单:

  • 使用参数化查询,不拼接字符串
  • 避免直接使用 evalFunction 构造函数
  • 对用户输出进行 HTML 转义
  • 使用 DOMPurify 等库清理 HTML

示例:

// ❌ NoSQL 注入风险
async function findUser(query: any) {
  return await db.users.findOne(query);
  // 如果 query = { "$gt": "" }, 会返回所有用户
}

// ✅ 使用参数化和验证
async function findUser(email: string): Promise<User | null> {
  // 验证 email 格式
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    throw new Error('Invalid email format');
  }

  return await db.users.findOne({ email });
}

1.4 敏感信息保护 🔴 必须检查

原则: 不要在代码中硬编码敏感信息,不要在日志中暴露敏感数据

检查清单:

  • 无硬编码的密钥、token、密码
  • 敏感信息使用环境变量
  • 错误日志不包含敏感信息
  • API 响应过滤敏感字段
  • 密码使用哈希存储

示例:

// ❌ 不安全: 硬编码密钥
const API_KEY = 'sk-1234567890abcdef';
const DB_PASSWORD = 'mypassword';

// ✅ 安全: 使用环境变量
const API_KEY = process.env.OPENAI_API_KEY;
if (!API_KEY) {
  throw new Error('OPENAI_API_KEY is required');
}

// ❌ 不安全: 日志包含敏感信息
console.log('User logged in:', {
  userId: user.id,
  email: user.email,
  password: user.password  // 密码被记录!
});

// ✅ 安全: 过滤敏感字段
const { password, ...safeUser } = user;
console.log('User logged in:', {
  userId: safeUser.id,
  email: safeUser.email
});

2. 正确性标准

2.1 错误处理 🔴 必须检查

原则: 所有可能失败的操作都必须有错误处理

检查清单:

  • 所有 async/await 都有 try-catch
  • Promise 都有 .catch() 处理
  • 错误信息清晰且有用
  • 区分业务错误和系统错误
  • 错误日志包含上下文信息

示例:

// ❌ 不好的错误处理
async function deleteUser(userId: string) {
  await db.users.deleteOne({ id: userId });
  // 没有错误处理,如果用户不存在会怎样?
}

// ✅ 好的错误处理
async function deleteUser(userId: string): Promise<void> {
  try {
    const result = await db.users.deleteOne({ id: userId });

    if (result.deletedCount === 0) {
      throw new Error(`User not found: ${userId}`);
    }

    console.log(`User ${userId} deleted successfully`);
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Failed to delete user ${userId}:`, error);
      throw new Error(`Delete user failed: ${error.message}`);
    }
    throw error;
  }
}

2.2 类型安全 🟡 推荐检查

原则: 充分利用 TypeScript 类型系统,避免类型错误

检查清单:

  • 避免使用 any 类型
  • 函数参数和返回值有明确的类型
  • 复杂类型使用 interface 或 type 定义
  • 使用类型守卫而不是类型断言
  • 启用 strict 模式

示例:

// ❌ 不好的类型使用
async function fetchData(id: any): any {
  const result: any = await db.collection('data').findOne({ id });
  return result;
}

// ✅ 好的类型使用
interface UserData {
  id: string;
  name: string;
  email: string;
  createdAt: Date;
}

async function fetchData(id: string): Promise<UserData | null> {
  const result = await db.collection<UserData>('data').findOne({ id });
  return result;
}

2.3 边界条件 🟡 推荐检查

原则: 考虑边界情况和异常输入

检查清单:

  • 空值处理 (null, undefined, '')
  • 空数组/空对象处理
  • 极限值处理 (0, 最大值, 最小值)
  • 并发和竞争条件
  • 资源耗尽情况

示例:

// ❌ 未处理边界条件
function getFirstItem<T>(items: T[]): T {
  return items[0];  // 如果数组为空会返回 undefined
}

// ✅ 处理边界条件
function getFirstItem<T>(items: T[]): T | undefined {
  if (items.length === 0) {
    return undefined;
  }
  return items[0];
}

// 或使用可选链
function getFirstItem<T>(items: T[]): T | undefined {
  return items[0];
}

// 使用时
const first = getFirstItem(items);
if (first) {
  // 安全使用 first
}

3. 性能标准

3.1 算法复杂度 🟡 推荐检查

原则: 避免不必要的嵌套循环,使用合适的数据结构

检查清单:

  • 避免嵌套循环 (O(n²) 或更差)
  • 大数据集使用合适的算法
  • 使用 Set/Map 优化查找操作
  • 分页处理大数据集

示例:

// ❌ 性能问题: O(n²)
function findDuplicates(arr: string[]): string[] {
  const duplicates: string[] = [];
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        duplicates.push(arr[i]);
      }
    }
  }
  return duplicates;
}

// ✅ 优化后: O(n)
function findDuplicates(arr: string[]): string[] {
  const seen = new Set<string>();
  const duplicates: string[] = [];

  for (const item of arr) {
    if (seen.has(item)) {
      duplicates.push(item);
    } else {
      seen.add(item);
    }
  }

  return duplicates;
}

3.2 数据库查询 🟡 推荐检查

原则: 避免 N+1 查询,使用索引优化查询

检查清单:

  • 避免 N+1 查询问题
  • 使用索引优化查询
  • 只查询需要的字段
  • 使用分页 (skip + limit)
  • 批量操作使用 bulkWrite

示例:

// ❌ N+1 查询问题
const users = await db.users.find({}).toArray();
for (const user of users) {
  const posts = await db.posts.find({ userId: user.id }).toArray();
  user.posts = posts;
}

// ✅ 使用 $in 操作
const users = await db.users.find({}).toArray();
const userIds = users.map(u => u.id);
const posts = await db.posts.find({ userId: { $in: userIds } }).toArray();

// 构建映射
const postsByUser = new Map<string, Post[]>();
posts.forEach(post => {
  if (!postsByUser.has(post.userId)) {
    postsByUser.set(post.userId, []);
  }
  postsByUser.get(post.userId)!.push(post);
});

// 关联数据
users.forEach(user => {
  user.posts = postsByUser.get(user.id) || [];
});

3.3 内存管理 🟢 可选检查

原则: 避免内存泄漏,及时清理资源

检查清单:

  • 避免内存泄漏 (事件监听器、定时器)
  • 及时清理不再使用的大对象
  • 使用流处理大文件
  • 避免不必要的闭包

4. 可测试性标准

4.1 测试覆盖 🟡 推荐检查

原则: 新功能必须有测试,核心功能要有充分测试,确保单元测试覆盖率在 90% 以上。

检查清单:

  • 新功能有对应的单元测试
  • 核心业务逻辑有集成测试
  • 关键路径有 E2E 测试
  • 测试覆盖主要场景 (正常和异常)

示例:

describe('UserService', () => {
  describe('createUser', () => {
    it('should create user successfully with valid data', async () => {
      // Arrange
      const userData = {
        name: 'Test User',
        email: 'test@example.com'
      };

      // Act
      const user = await createUser(userData);

      // Assert
      expect(user).toBeDefined();
      expect(user.id).toBeDefined();
      expect(user.name).toBe(userData.name);
    });

    it('should throw error with duplicate email', async () => {
      // Arrange
      const userData = {
        name: 'Test User',
        email: 'existing@example.com'
      };
      await createUser(userData);

      // Act & Assert
      await expect(createUser(userData)).rejects.toThrow('Duplicate email');
    });

    it('should throw error with invalid email', async () => {
      // Arrange
      const userData = {
        name: 'Test User',
        email: 'invalid-email'
      };

      // Act & Assert
      await expect(createUser(userData)).rejects.toThrow('Invalid email');
    });
  });
});

4.2 测试质量 🟢 可选检查

原则: 测试应该是独立的、可重复的、快速的

检查清单:

  • 测试用例独立,不依赖执行顺序
  • 测试用例可重复执行
  • 测试运行快速 (隔离慢操作)
  • 测试命名清晰描述测试意图
  • 使用 AAA 模式 (Arrange, Act, Assert)

5. 可维护性标准

5.1 代码组织 🟡 推荐检查

原则: 代码应该易于理解、修改和扩展

检查清单:

  • 函数/模块职责单一
  • 代码重复已抽取
  • 函数长度合理 (一般 < 50 行)
  • 文件结构清晰
  • 命名清晰表达意图

示例:

// ❌ 职责不单一,函数过长
async function processUser(userId: string) {
  const user = await db.users.findById(userId);
  if (!user) throw new Error('User not found');

  const orders = await db.orders.find({ userId }).toArray();
  const totalAmount = orders.reduce((sum, order) => sum + order.amount, 0);

  const recommendations = await generateRecommendations(user);
  const notifications = await buildNotifications(user, recommendations);

  await sendEmail(user.email, notifications);
  await updateLastLogin(userId);

  return { user, orders, totalAmount, recommendations };
}

// ✅ 职责单一,易于测试
async function getUserProfile(userId: string) {
  const user = await db.users.findById(userId);
  if (!user) throw new Error('User not found');
  return user;
}

async function getUserOrders(userId: string) {
  return await db.orders.find({ userId }).toArray();
}

async function calculateTotalAmount(orders: Order[]) {
  return orders.reduce((sum, order) => sum + order.amount, 0);
}

async function processUser(userId: string) {
  const user = await getUserProfile(userId);
  const orders = await getUserOrders(userId);
  const totalAmount = calculateTotalAmount(orders);

  return { user, orders, totalAmount };
}

5.2 命名规范 🟢 可选检查

原则: 命名应该清晰表达意图,遵循团队约定

检查清单:

  • 变量名清晰表达用途
  • 函数名使用动词开头
  • 布尔值变量使用 is/has/should 前缀
  • 常量使用 UPPER_SNAKE_CASE
  • 类/接口使用 PascalCase

示例:

// ❌ 不好的命名
const d = new Date();
const temp1 = getUser();
const flag = checkUser();

// ✅ 好的命名
const currentDate = new Date();
const currentUser = getUser();
const isAuthenticated = checkUser();

6. 文档标准

6.1 注释质量 🟢 可选检查

原则: 注释应该解释"为什么"而不是"是什么"

检查清单:

  • 复杂逻辑有清晰注释
  • 注释解释设计决策
  • 公共 API 有 JSDoc 注释
  • TODO/FIXME 有跟踪 issue

示例:

// ❌ 不好的注释: 重复代码
// 获取用户
const user = await getUser(userId);

// ✅ 好的注释: 解释原因
// 使用缓存避免重复查询数据库
const user = await getUserWithCache(userId);

// ❌ 不好的注释: 没有解释
// 重试 3 次
for (let i = 0; i < 3; i++) {
  try {
    return await operation();
  } catch (error) {
    // 继续尝试
  }
}

// ✅ 好的注释: 解释设计决策
// 重试 3 次处理临时网络故障
// 使用指数退避避免服务器过载
for (let attempt = 1; attempt <= 3; attempt++) {
  try {
    return await operation();
  } catch (error) {
    if (attempt === 3) throw error;
    await sleep(Math.pow(2, attempt) * 1000);
  }
}

6.2 API 文档 🔴 必选检查

所有修改到的 API 都需要用 zod 来进行类型声明以及编写对应的 OpenAPI 文档。

参考: api-development.md


快速检查表

🔴 必须检查项 (阻塞性)

  • 输入验证: 所有用户输入都经过验证
  • 权限验证: API 路由都有权限检查
  • 注入防护: 使用参数化查询
  • 敏感信息: 无硬编码密钥
  • 错误处理: 所有异步操作有错误处理

🟡 推荐检查项 (建议性)

  • 类型安全: 避免使用 any
  • 边界条件: 处理空值和边界情况
  • 算法复杂度: 避免嵌套循环
  • 数据库查询: 避免 N+1 查询
  • 测试覆盖: 新功能有测试
  • 代码组织: 职责单一,无重复代码

🟢 可选检查项 (优化性)

  • 命名规范: 命名清晰表达意图
  • 注释质量: 复杂逻辑有注释
  • API 文档: 公共 API 有 JSDoc
  • 内存管理: 避免内存泄漏

Version: 1.0 Last Updated: 2026-01-27 Maintainer: FastGPT Development Team