fe-lint-fix:前端代码质量一键修复与类型校验
定位
封装「改完前端代码收尾」的标准动作:Prettier → Stylelint → ESLint 自动修复,再跑 TypeScript 类型校验。把一串容易记错 glob / cache / 执行顺序的命令固化成一条脚本,不绑定任何具体仓库或包管理器——放进任意带 package.json 的前端项目都能跑。
对话里说「跑一下 lint」「修复 lint 报错」「格式化代码」「eslint --fix」「vue-tsc/tsc 类型检查」「提交前过一遍 lint」等即触发。即使只说「修一下格式/报错」也走它。
为什么用脚本而不是手敲 npx
- 执行顺序有讲究:必须先格式化(Prettier/Stylelint)再 ESLint。反过来的话,用了
eslint-plugin-prettier的项目会在格式化前把prettier/prettier规则当成一堆 ESLint 失败误报——等 Prettier 改完其实早就干净了。脚本把顺序固化对。 - glob / cache 路径会记错:stylelint 的
**/*.{vue,less,postcss,css,scss}+ cache 目录、eslint 的--cache --max-warnings 0手敲容易漏。 - 每个项目不一样:包管理器可能是 pnpm/yarn/bun/npm,可能有也可能没有
lint:eslint这类脚本,可能用 vue-tsc 也可能用 tsc。脚本全自动探测。 - 修复与校验分清:4 步各标 ✅/❌/⏭,最后汇总「哪几步需人工」,TypeScript 这种只能人工改的错误不会被淹没。
默认用法(日常收尾)
bash "${VFT_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-${CODEX_PLUGIN_ROOT:-}}}/skills/fe-lint-fix/scripts/lint-fix.sh"
不带参数 = 对当前工作目录依次跑 Prettier --write → Stylelint --fix → ESLint --fix → TypeScript --noEmit。
- 前三步就地自动修复文件,能修的都修掉;项目没装某个工具的自动跳过(⏭)。
- 第四步只校验不改文件,类型错误必须人工修。
- 全部通过退出码 0;任一步有「自动修复解决不了」的残留则退出码 1,并打印对应报错末尾日志。
指定其它目录 / 子包
第一个位置参数或 -t 就是目标,可相对当前目录或绝对路径:
lint-fix.sh packages/ui # monorepo 里换个子包
lint-fix.sh -t apps/web # 显式指定
lint-fix.sh /abs/path/to/pkg # 绝对路径
目标目录必须有 package.json,否则报错退出(exit 2)。
只跑某一步 / 跳过某一步
lint-fix.sh --eslint # 只 eslint --fix(--stylelint / --prettier / --ts 同理,互斥)
lint-fix.sh --no-ts # 跳过类型检查(改纯样式/纯格式时常用)
lint-fix.sh --no-prettier --no-stylelint # 只跑 eslint + ts,可叠加
--xxx(只跑)和 --no-xxx(跳过)按需选,别同时给冲突的两类。
探测逻辑(出问题看这里)
包管理器:lockfile 优先(pnpm-lock.yaml / yarn.lock / bun.lock(b) / package-lock.json),再看 package.json 的 packageManager 字段,最后按现成二进制兜底,都没有降级 npm。若项目有 volta 字段且本机装了 Volta,自动用 volta run <pm>,避免全局版本不匹配。
每一步都是「有对应 npm 脚本就用脚本,没有回退直调二进制,二进制也没装就跳过」:
| 步骤 | 优先脚本名 | 回退命令(探测到装了才跑) |
|---|---|---|
| Prettier | lint:prettier / format:prettier / format | <pm> exec prettier --write . |
| Stylelint | lint:stylelint / lint:style / stylelint | <pm> exec stylelint "**/*.{vue,less,postcss,css,scss}" --fix --cache ... --allow-empty-input |
| ESLint | lint:eslint / lint:es / lint | <pm> exec eslint . --cache --max-warnings 0 --fix |
| TypeScript | type-check / lint:type / typecheck / tsc / lint:tsc | 有 vue-tsc 依赖 → vue-tsc --noEmit;否则有 typescript+tsconfig.json → tsc --noEmit |
优先用项目脚本,是因为脚本里编码了项目特有的 glob / cache / 阈值。项目加了
type-check等脚本后本 skill 自动优先用它,无需改脚本。
失败排查
| 现象 | 原因 / 处理 |
|---|---|
目标目录无 package.json | TARGET 路径错了,确认相对当前目录或给绝对路径 |
| 某步显示 ⏭ 跳过 | 项目没装该工具 / 没有 tsconfig,属正常;要用先在项目里装依赖 |
| ESLint ❌ 仍有残留 | --fix 修不了的 error/warning(未用变量、逻辑问题),按日志人工改;未使用变量加 _ 前缀 |
| Stylelint ❌ 仍有残留 | 极少见,多数能 --fix;看日志按属性顺序 / 选择器规则手改 |
| TypeScript ❌ | 类型错误只能人工改,本步从不改文件;按 文件:行 定位修 |
exec ... not found | 目标目录没装该依赖,先在项目里装一次 |
与其它 skill 的关系
- 改完前端代码 →
fe-lint-fix(本 skill)收尾质量 - 需要真实浏览器验证页面行为 → fe-auto-test
- 收尾干净后想绕过 hooks 提交 → git-auto-push
许可
MIT。

还没有留言,来发表第一条吧~