用途
code-smells-audit 是一个目录驱动的代码异味审计技能。它不依赖评审者的临场记忆,而是把发现结果逐条对照 56 张精炼参考卡,这些卡源自 Marcel Jerzyk 的 Code Smells Catalog,并在进入报告前按每项异味的实际定义进行核验。适用于对代码库、指定路径或分支差异做系统性异味排查。
主要能力
- 范围解析:参数可以是路径(递归扫描该文件或目录)、glob(匹配文件)、diff(当前分支变更,即
git diff --name-only $(git merge-base <default-branch> HEAD)列出的文件加上git status --porcelain中的未提交改动,只审计这些文件,判断严重度时只看变更区域),或为空(全仓库扫描)。 - 排除依赖与生成代码:始终排除
vendor/、node_modules/、锁文件、构建产物以及.gitignore忽略的内容,只审计源码。 - 分片扫描:全仓库扫描时按代码库规模分派子代理——小型(约 100 个源文件以内)由主代理顺序执行透镜扫描;中型(约 1,000 以内)每个发生场景透镜一个子代理并行扫描全目标;大型按顶层模块或目录分区,每个分区一个子代理跑全部透镜,验证前合并候选列表。在 Claude Code 中安装了该插件时,可分发
subagent_type=leek-skills:smell-sweeper(只读、不加载项目 CLAUDE.md、使用更便宜的模型);其他环境下可用任意只读子代理和最便宜的模型,扫描只负责召回,验证在主模型上进行。 - 透镜扫描:先读
references/index.md,它把 56 项异味归入 9 个发生场景透镜并各附一行描述;透镜归属只以该索引为准,不从记忆中的异味清单出发。每个透镜跑一次检测,凭该透镜的一行描述扫描目标,疑似匹配即记录候选:candidate: <smell slug> · <file:line-range> · <one-line evidence>。扫描阶段不读完整卡、不判断、不排序、不过滤,偏向召回。 - 对抗性验证:每个候选都要读
references/smells/<slug>.md完整卡,以怀疑视角重读代码,确认是否真正满足卡中的定义段与检测启发式,还是仅触碰了表面信号(长度、关键词、形状)的近似误判。存活的发现必须引用或紧密转述卡定义中代码所满足的具体句子,作为合格理由;若无一句定义契合,候选即失败。对依赖引用关系的异味(Dead Code、Lazy Element、Middle Man、Feature Envy、Shotgun Surgery、Speculative Generality),应统计调用点而非目测:有语言服务器时用 LSP 的 findReferences / incomingCalls,否则用rg搜索符号,并在理由中说明计数为近似值。失败候选不进入报告,仅在报告头部保留数量。 - 报告输出:写入被审计仓库的
docs/audits/code-smells-<scope>-<YYYY-MM-DD>.md(必要时创建目录),用户另行指定路径时除外。发现按判断的严重度/影响力排序:影响范围、定义契合程度、代码再次被改动的可能性;逐条独立判断,绝不把分类法当作严重度代理。每条发现包含:异味名称、位置(file:line-range)、合格理由(引用卡定义)、阻碍标签(卡分类行的中间项)、建议重构(来自卡)、卡片路径。报告骨架含目标、扫描透镜数、候选数、验证剔除数、发现数等统计,写完文件后在会话中概述主要发现并指向该文件。切片为工单不在范围内,报告交由用户或/to-tickets处理。
参考材料
references/index.md:56 项异味按 9 个透镜分组,各一行,检测分派从此出发。references/smells/<slug>.md:每项异味一张卡,含分类行、定义、检测启发式(通用 + PHP/Laravel + TS/React)、示例、重构建议、类型化关联异味链接、别名。references/refactoring-names.md:规范重构词汇及上游 103 个原始名称的归一化映射。references/ATTRIBUTION.md:上游 MIT 声明与所请求的学术引用。
校验卡片集
卡片编辑、批量新增或上游重新同步后运行:
bash scripts/validate-cards.sh # strict: all 56 cards must exist (ship gate)
bash scripts/validate-cards.sh --partial # mid-build: missing cards reported as pending
人类可读状态输出到 stderr,stdout 输出 JSON 结果;通过退出码 0,失败退出码 1(每个失败指明问题文件与原因),用法错误退出码 2。脚本内置 56 个 slug 目录与封闭分类词汇,并从 references/refactoring-names.md 读取规范重构名,无需网络和上游克隆。
适用场景与限制
适用于对代码库、路径或分支差异做结构化异味审计,结果可留存以便跨时间对比。局限:检测与验证依赖上述参考卡与透镜索引,需具备相应文件;规则集聚焦 PHP/Laravel 与 TS/React 启发式;不负责把发现拆成工单;子代理分派方式视宿主环境而定,具体可用模型与工具未在本资料中给出。