Lint 与代码风格

让 Agent 维护可执行的格式与 Lint 约定:共享配置、EditorConfig、格式化与 Lint 职责分离,以及 pre-commit 与 CI 的分工。本页按「流程 → 配置 → 钩子与 CI → 治理 → 实验室」展开。

在 monorepo 或多语言仓库中,SKILL 应指明根配置与子包扩展关系,避免重复规则与版本漂移;格式化与 Lint 职责分离可减少冲突。

提交前钩子与 CI 对齐:本地可自动修复的项在 pre-commit 处理,CI 仅做不可自动修复规则的硬门禁,减少无意义红构建。

从编辑到合流(本地 → CI)

  [ 编辑 / 生成代码 ]
        │
        ▼
  ┌─────────────┐     EditorConfig + 编辑器 format on save(可选)
  │  工作区约定   │──── 共享 extends:根 .eslintrc / ruff.toml / biome.json
  └─────────────┘
        │
        ▼
  ┌─────────────┐     format + lint --fix;失败则阻断提交或自动 stage
  │  pre-commit  │──── 与 CI 使用同一工具版本(锁文件或 npx/pipx pin)
  └─────────────┘
        │
        ▼
  ┌─────────────┐     lint(无 fix)/ typecheck / 测试;产物目录 paths-ignore
  │  CI 门禁    │──── 不重复跑已在钩子中且已提交的格式化 diff
  └─────────────┘
        │
        ▼
        [ 合并 ]

原则:编辑器与钩子尽量「自动修」,CI 尽量「只报不修」或单独 job 产出建议报告,避免同一 PR 上机器与人重复唠叨格式问题。

共享配置与 monorepo 扩展

根目录放「团队基线」包或 extends 指向的共享 preset;子包仅声明差异(如浏览器端 vs Node、测试目录覆盖)。Agent 改规则时同步 bump 版本号与变更说明。

  • 行尾、缩进、字符集与 .editorconfig 一致,避免 formatter 与编辑器各写一套。
  • 多运行时(如 JS + Python)为每栈保留单一事实来源,禁止复制粘贴整份配置到多个目录。
  • 生成物目录(dist/coverage/)在工具层与 CI paths-ignore 双层排除。

Prettier 完整配置与 EditorConfig 示例:

// .prettierrc.json — Prettier 完整配置
{
  "semi": true,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "trailingComma": "all",
  "tabWidth": 2,
  "useTabs": false,
  "printWidth": 100,
  "bracketSpacing": true,
  "bracketSameLine": false,
  "arrowParens": "always",
  "endOfLine": "lf",
  "embeddedLanguageFormatting": "auto",
  "overrides": [
    {
      "files": ["*.json", "*.yaml", "*.yml"],
      "options": { "tabWidth": 2 }
    },
    {
      "files": "*.md",
      "options": { "proseWrap": "always", "printWidth": 80 }
    }
  ]
}

// .prettierignore
// dist/
// coverage/
// **/*.generated.ts
// pnpm-lock.yaml

# .editorconfig — 与 Prettier 保持一致
root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false
max_line_length = 80

[Makefile]
indent_style = tab  # Makefile 必须用 tab

格式化 vs Lint

格式化(Prettier / Ruff format / rustfmt)

  • 追求确定性输出,少选项、少争论。
  • 不与 ESLint stylistic 规则叠床架屋;选一为主。
  • 大文件或生成代码可 .prettierignore / 等价机制。

Lint(语义与策略)

  • 可自动修复与不可自动修复分层标注。
  • 禁止无讨论关闭整类 category;用范围或覆盖文件收窄。
  • 新规则先 advisory / report-only,再有数据切 enforce。

pre-commit 与 CI 分工

  • 钩子:快速、可修复、开发者本机可复现;缓存依赖加速。
  • CI:全量矩阵(多 Node/Python 版本按需)、不可本地省略的检查、上传报告。
  • 同一检查不要在钩子「仅 warn」而 CI「error」长期不一致;过渡期写进团队文档与截止日期。

lint-staged + Husky 完整配置:

// 1. 安装 Husky + lint-staged
// npm install -D husky lint-staged
// npx husky init

// package.json — lint-staged 配置(只 lint 改动的文件)
{
  "lint-staged": {
    "*.{ts,tsx}": [
      "eslint --max-warnings 0 --fix",
      "prettier --write"
    ],
    "*.{js,jsx,mjs,cjs}": [
      "eslint --max-warnings 0 --fix",
      "prettier --write"
    ],
    "*.{json,yaml,yml,md}": [
      "prettier --write"
    ],
    "*.py": [
      "ruff check --fix",
      "ruff format"
    ]
  }
}

# .husky/pre-commit — 提交前运行 lint-staged
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged

# .husky/pre-push — 推送前运行测试(可选,耗时则谨慎)
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run test:unit  # 只跑单测,不跑集成测试

// ESLint + Prettier 协作配置(解决冲突)
// 方案:eslint-config-prettier 关闭与 Prettier 冲突的 ESLint 规则
// npm install -D eslint-config-prettier
// .eslintrc.json 中 extends 末尾添加 "prettier"(必须最后):
{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"    // 必须放最后,覆盖与 Prettier 冲突的规则
  ]
}

规则治理与升级

对争议规则(引号、尾逗号等)用 ADR 或配置旁注释记录决策;大版本升级 ESLint / Ruff 时分阶段迁移并保留迁移清单(破规 diff、禁用项、跟进 issue)。

  • 合并后回顾:长期被大量 eslint-disable 的规则考虑降级或改范围。
  • Agent 修改共享配置时,必须更新示例代码与 onboarding 文档中的「推荐扩展」一节。

命令与分工备忘录(lintfmt-page JS)

勾选技术栈与运行面,生成本地可复制的 package.json scripts 示意与 pre-commit / CI 分工备忘(需按仓库包管理器与目录结构调整)。

技术栈(可多选)
pre-commit 侧重
CI 侧重

非 Node 栈的 scripts 仅作注释块列出等价 CLI;monorepo 请改为 pnpm -r / turbo run 等统一入口。生成物目录务必加入各工具 ignore 与 CI paths 过滤。

---
name: lint-format-cn
description: 统一 Lint、格式化配置与 CI 自动修复流程
---
# 工具职责分离
- Prettier:格式化(确定性输出,不与 ESLint stylistic 重叠)
- ESLint:语义与策略(禁止项 / 废弃 API / 复杂度)
- EditorConfig:编辑器层约定(行尾/缩进/字符集)
- lint-staged:只 lint/format 改动文件,速度快

# 配置文件清单
- .prettierrc.json     ← Prettier 规则(semi/singleQuote/trailingComma 等)
- .prettierignore      ← dist/ coverage/ *.generated.ts
- .eslintrc.json       ← extends: [..., "prettier"](prettier 必须最后)
- .editorconfig        ← 与 Prettier 保持一致(lf/2空格/utf-8)
- package.json         ← lint-staged 配置

# Husky 设置
- .husky/pre-commit    → npx lint-staged
- .husky/pre-push      → npm run test:unit(可选)

# lint-staged 推荐配置
- *.{ts,tsx}           → eslint --fix + prettier --write
- *.{json,yaml,md}     → prettier --write
- *.py                 → ruff check --fix + ruff format

# pre-commit vs CI 分工
- pre-commit: 快速、自动修复(write/fix 模式)
- CI: 仅检查(--check/--no-fix),失败即红,不修改文件
- 同一规则两处不能级别不一致(本地 warn vs CI error)

# ESLint + Prettier 协作
- 安装 eslint-config-prettier
- extends 末尾添加 "prettier"(关闭冲突规则)
- 禁止同时用 ESLint stylistic 规则和 Prettier

# 规则治理
- 争议规则用 ADR 或旁注释记录决策
- 大版本升级 ESLint/Ruff 时分阶段迁移
- 长期被大量 eslint-disable 的规则降级或改范围

返回技能库 更多技能入口