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/)在工具层与 CIpaths-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 分工备忘(需按仓库包管理器与目录结构调整)。
非 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 的规则降级或改范围