---
description: 代码检查工具规范 - ESLint、Prettier 配置与使用。涉及 lint 配置、格式化、代码检查时触发。
globs: ["**/.eslintrc*", "**/.prettierrc*", "**/eslint.config.*", "**/prettier.config.*"]
alwaysApply: false
---

# 代码检查规范

该规则定义代码检查工具配置标准，核心原则：质量检查 + 格式统一 + 自动化集成。

---

## 必须遵守

- ✅ 项目必须配置 ESLint 进行代码质量检查
- ✅ 项目必须配置 Prettier 进行代码格式化
- ✅ TypeScript 项目必须使用 @typescript-eslint 规则集
- ✅ 框架项目必须使用官方规则集（eslint-plugin-vue）
- ✅ 代码提交前必须通过 lint 检查
- ✅ CI/CD 流程必须包含 lint 检查步骤
- ✅ 禁用规则必须有明确注释说明原因
- ✅ 局部禁用规则必须尽可能缩小范围

---

## 严格禁止

- ❌ 提交未通过 lint 检查的代码
- ❌ 随意使用 eslint-disable 绕过检查
- ❌ 全局禁用重要质量规则
- ❌ 在 CI 中忽略 lint 错误
- ❌ 提交包含 @ts-ignore 的代码（除非必要并注释）
- ❌ 提交包含 any 类型的代码（除非必要）
- ❌ 提交包含 console.log 调试代码
- ❌ 随意修改项目 lint 配置
- ❌ 提交个人 IDE lint 配置文件

---

## 最佳实践

- 💡 使用 husky + lint-staged 自动检查
- 💡 IDE 配置保存时自动修复
- 💡 使用 unknown 替代 any 并进行类型守卫
- 💡 使用 @ts-expect-error 替代 @ts-ignore

---

## 代码示例

### ESLint 配置

```javascript
// .eslintrc.js
module.exports = {
  root: true,
  env: { browser: true, es2021: true, node: true },
  extends: [
    "plugin:vue/vue3-recommended",
    "@vue/eslint-config-typescript",
    "@vue/eslint-config-prettier",
  ],
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "error" : "warn",
    "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
    "@typescript-eslint/no-explicit-any": "warn",
    "vue/multi-word-component-names": "error",
    "prettier/prettier": "error",
  },
};
```

### Prettier 配置

```json
{
  "semi": true,
  "singleQuote": true,
  "printWidth": 100,
  "tabWidth": 2,
  "trailingComma": "es5",
  "endOfLine": "lf"
}
```

### Git Hooks 集成

```json
{
  "scripts": {
    "prepare": "husky install",
    "lint": "eslint . --ext .ts,.tsx,.js,.jsx,.vue",
    "lint:fix": "eslint . --ext .ts,.tsx,.js,.jsx,.vue --fix"
  },
  "lint-staged": {
    "*.{ts,tsx,js,jsx,vue}": ["eslint --fix", "prettier --write"],
    "*.{json,css,scss,md}": ["prettier --write"]
  }
}
```

### 局部禁用规则

```typescript
// ✅ 有说明原因
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const config: any = loadConfig(); // 第三方库类型不完整

// ✅ 缩小范围
function legacyCode() {
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
  const data = getLegacyData(); // 遗留代码，计划重构
  /* eslint-enable @typescript-eslint/no-unsafe-assignment */
}

// ❌ 无说明原因
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const data: any = {};
```

### TypeScript 特殊处理

```typescript
// ✅ 使用 @ts-expect-error
// @ts-expect-error - 第三方库类型定义错误，已提 issue
import { brokenFunction } from "legacy-lib";

// ✅ 使用 unknown + 类型守卫
function processData(data: unknown) {
  if (typeof data === "object" && data !== null) {
    // 安全处理
  }
}
```

### CI/CD 集成

```yaml
name: Lint
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with: { node-version: "18", cache: "pnpm" }
      - run: pnpm install
      - run: pnpm run lint
```

### 忽略文件

```
# .eslintignore / .prettierignore
dist/
build/
node_modules/
*.min.js
coverage/
```
