关于 anti-slop
Anti-Slop 是用于识别 AI 生成代码常见模式的代码审计技能。它依据模式目录检查支持的源文件,并生成包含位置、严重程度和修复建议的结构化报告。
主要功能
- 01审计支持的源文件
- 02检查七类代码模式
- 03报告行号与严重程度
- 04提供简洁修复建议
- 05标记长文件的部分审计
适用场景
- 01检查代码中的不必要复杂性
- 02定位死代码和类型绕过
- 03检查多文件间重复的工具函数
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ b4r7x/ agent-skills --skill anti-slop安装后在 Claude Code 中输入/anti-slop确认已加载。
附带文件references/slop-code-patterns.md
详细介绍
Anti-Slop
审计源代码中的 AI 生成的冗余模式,并输出结构化报告。
工作流
步骤 1 — 解析文件
将参数解析为文件路径或 glob 模式。将 glob 展开为具体的文件列表。
# If argument is a glob like "src/**/*.ts", expand it
# If argument is a file path, use it directly
# If multiple paths/globs, expand all
支持的扩展名: .ts、.tsx、.js、.jsx、.py、.go、.rs、.java、.rb、.php、.swift、.kt
超过 1000 行的文件:仅审计前 500 行,并将文件的报告条目标记为 partial — first 500 of N lines;绝不能将部分审计报告为完整审计。
如果未提供参数,请提示用户:
“要审计哪些文件?请传入文件路径或 glob 模式(例如
src/**/*.ts)。”
步骤 2 — 阅读模式目录
阅读 references/slop-code-patterns.md,了解完整的检测规则和严重性指南。
步骤 3 — 审计每个文件
对每个文件:
-
阅读文件内容
-
扫描全部 7 个类别中的模式:
- 类别 1:不必要的注释 — 重述代码、显而易见的 JSDoc、含糊的 TODO、分节分隔符、“已移除”标记
- 类别 2:过度工程化 — 过早抽象、不必要的工厂、为硬编码值添加配置、转发包装器、仅用一次的接口
- 类别 3:防御性过度编码 — 对非空类型进行空值检查、对必定成功的操作使用 try-catch、return 后冗余的 else、冗长的错误消息、掩盖 bug 的回退逻辑
- 类别 4:AI 口吻 — “enhanced/optimized/improved” 命名、“ensure/robust/graceful” 注释、对控制流的旁白说明、道歉式注释
- 类别 5:死代码 — 未使用的导入、赋值后未读取的变量、不可达代码、向后兼容的重新导出
- 类别 6:类型变通 —
as any、未说明原因的@ts-ignore、不必要的断言 - 类别 7:冗长模式 — 可用
??替代的三元表达式、冗长的布尔表达式、不必要的 async/await、无意义的展开运算符
-
对发现的每个问题,记录:
- 行号
- 类别(1-7)
- 模式(例如,“1a:重述代码”)
- 严重性(高 / 中 / 低)
- 问题代码(1-3 行)
- 建议修复方式(简述要怎么做,不要给出完整改写)
步骤 4 — 跨文件检查
完成单个文件的审计后,检查跨文件模式:
- 仅在一个文件中调用的函数 — 可能是过早抽象(类别 2a)
- 未在其他文件中导入的导出符号 — 可能是死代码(类别 5d)
- 跨文件重复的实用函数 — AI 经常会在多个位置创建相同的辅助函数
仅在审计 3 个或更多文件时运行这些检查。使用 grep 搜索代码库中的函数和导出符号使用情况。
步骤 5 — 输出报告
按以下格式整理报告:
## Anti-Slop Audit Report
**Files audited:** N
**Issues found:** N (H high, M medium, L low)
---
### `path/to/file.ts`
| Line | Severity | Category | Pattern | Issue |
|------|----------|----------|---------|-------|
| 12 | medium | Unnecessary comment | 1a: restating code | `// set the name` above `this.name = name` |
| 45-52 | medium | Over-engineering | 2a: premature abstraction | `formatDate()` called once, body is one line |
| 89 | high | Type workaround | 6a: `as any` | `response.data as any` — fix the response type |
**Suggested fixes:**
- L12: Delete the comment
- L45-52: Inline `formatDate()` at L78
- L89: Type `response.data` as `ApiResponse` based on the fetch call at L85
---
### `path/to/other-file.ts`
...
---
### Cross-File Issues
- `formatSlug()` defined in `utils.ts:34` is only imported by `page.ts:2` — consider inlining
- `UserDTO` exported from `types.ts:12` is not imported anywhere
---
### Summary by Category
| Category | Count |
|----------|-------|
| 1. Unnecessary comments | N |
| 2. Over-engineering | N |
| 3. Defensive over-coding | N |
| 4. AI voice | N |
| 5. Dead code | N |
| 6. Type workarounds | N |
| 7. Verbose patterns | N |
如果未发现问题,输出:
## Anti-Slop Audit Report
**Files audited:** N
**Issues found:** 0
Clean. No slop detected.
评论
支持 Markdown