将项目级的 Ratchet/约定检测方法论融入 req-test-gate 技能, 通过 /req 流程三个节点自动触发(dev 环境检测、cr 约定建议、test Gate 0B), 无需手动记忆执行。 新增文档:harness-engineering.md、ratchet-pattern.md、convention-flow.md、 project-bootstrap.md 及 4 个模板(ratchet/convention 脚本、GATES.md、pre-commit)。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
Pre-commit Configuration Template
husky + lint-staged 配置模板,三种变体:Node.js 项目、Go 项目、Monorepo。
变体 1: Node.js 项目(React / Vue / 纯 TS)
安装
npm install -D husky lint-staged prettier eslint
npx husky init
echo "npx lint-staged" > .husky/pre-commit
package.json
{
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix --max-warnings 0",
"prettier --write"
],
"*.{css,less,scss}": [
"prettier --write"
],
"*.{json,md}": [
"prettier --write"
]
}
}
变体 2: Go 项目
安装
# Go 项目需要 package.json 来驱动 husky
npm init -y
npm install -D husky lint-staged
npx husky init
echo "npx lint-staged" > .husky/pre-commit
package.json
{
"lint-staged": {
"*.go": [
"gofmt -s -w",
"bash -c 'go vet ./...'"
]
}
}
可选:golangci-lint(更严格)
{
"lint-staged": {
"*.go": [
"gofmt -s -w",
"bash -c 'go vet ./...'",
"bash -c 'golangci-lint run --fix'"
]
}
}
变体 3: Monorepo(Go + Node.js)
安装(根目录)
npm install -D husky lint-staged
npx husky init
echo "npx lint-staged" > .husky/pre-commit
package.json(根目录)
{
"lint-staged": {
"frontend/**/*.{ts,tsx}": [
"bash -c 'cd frontend && npx eslint --fix --max-warnings 0'",
"bash -c 'cd frontend && npx prettier --write'"
],
"frontend/**/*.{css,less,json}": [
"bash -c 'cd frontend && npx prettier --write'"
],
"backend/**/*.go": [
"gofmt -s -w",
"bash -c 'cd backend && go vet ./...'"
]
}
}
注意事项
bash -c 'cd xxx && ...'确保命令在正确的子目录中执行- lint-staged 传递的文件路径是相对于根目录的,部分工具(如
go vet)需要在子目录执行 - 如果前端和后端各自有
package.json,lint-staged 仍然在根目录配置
验证配置
# 修改一个文件后测试 pre-commit hook
echo "// test" >> some-file.ts
git add some-file.ts
git commit -m "test: verify pre-commit hook"
# 应该看到 lint-staged 执行 ESLint + Prettier
# 如果有 lint 错误,commit 会被阻止
常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| lint-staged 不执行 | .husky/pre-commit 内容不对 |
确认内容为 npx lint-staged |
| ESLint 报错太多 | 旧项目首次启用 | 先 npx eslint --fix 全量修复,再启用 hook |
| gofmt 修改后 commit 内容不一致 | lint-staged 自动 format 后需要 re-stage | lint-staged 自动处理,无需手动 |
| Monorepo 路径错误 | lint-staged 传递根目录相对路径 | 使用 bash -c 'cd sub && ...' 包装 |