大数跨境

AI编程Agent写代码一时爽,AISlop帮你揪出50+种AI代码坏味道

AI编程Agent写代码一时爽,AISlop帮你揪出50+种AI代码坏味道 硅链AI
2026-05-31
27
导读:Claude Code、Cursor 生成的代码能编译、能通过测试,但藏着一堆人类工程师不会写的"坏味道"——AISlop 用 6 大检测引擎、50+ 条规则,给你一个 0-100 分的代码质量分数。

Claude Code、Cursor 生成的代码能编译、能通过测试,但藏着一堆人类工程师不会写的"坏味道"——AISlop 用 6 大检测引擎、50+ 条规则,给你一个 0-100 分的代码质量分数。

为什么 AI 写的代码需要专门的质量检查?

2026 年 5 月,Ars Technica 报道了一个令人警醒的事件:一位开发者受够了"vibe coding"(让 AI 随便写代码不审查),在 jqwik 测试库中埋入了一个 prompt injection——当 AI 编程 Agent 扫描到该代码时,会被指示删除应用的输出文件。这件事暴露了一个残酷现实:大量开发者正在把 AI 生成的代码直接合并到主分支,不做任何审查。

这不仅仅是安全风险。即使没有恶意注入,AI 编程 Agent——Claude Code、Cursor、Codex、OpenCode——生成的代码虽然能编译、能通过测试,却往往带有一些人类工程师不会写的"坏味道":

  • 叙事性注释
    // This function takes a user object and returns the formatted name —— 代码本身已经自解释了,这种注释纯属浪费
  • 吞掉的异常
    try { ... } catch(e) { /* ignore */ } —— AI 为了让代码"跑起来",习惯性忽略错误处理
  • as any 类型断言
    :TypeScript 里随处可见的类型逃逸,AI 遇到类型报错就用 as any 糊过去
  • 幻觉导入
    :import 了一个项目中根本不存在的模块
  • TODO 占位符
    // TODO: implement error handling —— 永远没人实现
  • 巨型函数
    :一个函数 300+ 行,AI 不会主动拆分

传统 Linter(ESLint、Ruff、golangci-lint)能抓到一部分,但它们不是为 AI 代码模式设计的。AISlop 正是填补这个空白的工具。

AISlop 是什么?

AISlop 是一个 MIT 开源的 CLI 工具,专门检测 AI 编程 Agent 在代码中留下的"坏味道"。它支持 TypeScript/JavaScript、Python、Go、Rust、Ruby、PHP、Java 共 7 种语言,50+ 条检测规则,亚秒级扫描,纯确定性——不使用 LLM,相同代码永远返回相同分数。

核心能力:

能力
说明
6 大检测引擎
格式化、Linting、代码质量、AI Slop、安全、架构
50+ 条规则
覆盖叙事注释、无用注释、死代码、as any、console.log 残留等
0-100 评分
加权评分,AI 坏味道扣分更重
自动修复
格式化、无用导入、死代码可自动修复
Agent 集成
Claude Code、Cursor、Gemini CLI、Codex 等 15+ Agent 的原生钩子
MCP Server
作为 MCP 工具暴露给 Claude Desktop、Cursor 等

快速上手

不需要安装,一行命令就能扫描整个项目:

npx aislop scan

这会扫描当前目录下的所有代码文件,输出一个 0-100 的分数和详细的问题列表。

安装到项目:

npm install --save-dev aislop

# 或 pnpm add -D aislop

# 或 yarn add --dev aislop

初始化配置:

npx aislop init

会在项目根目录创建 .aislop/config.yml,你可以在这里定制规则。

AI 代码坏味道实战:10 种最常见的"Slop"

▲ AI 代码 10 大坏味道:叙事注释、吞异常、类型逃逸、死代码、TODO 占位符

1. 叙事性注释(narrative-comment)

AI 最爱写的注释类型:

// This function validates the user input and returns a boolean

function validateInput(input: string): boolean {

  return input.length > 0 && input.length < 100;

}

代码本身已经自解释了——函数名叫 validateInput,返回 boolean。注释什么都没增加。AISlop 会标记这类注释。

2. 琐碎注释(trivial-comment)

# increment counter

counter += 1

这种注释比代码本身还长,纯属噪音。

3. 吞掉的异常

try {

  await fetchUserData(userId);

} catch (e) {

  // silent fail

}

AI 为了让代码"不出错",经常吞掉所有异常。AISlop 的安全引擎会检测这类模式。

4. `as any` 逃逸

const data = response.data as any;

const result = data.items.map((item: any) => item.name);

TypeScript 的类型安全在 AI 手里形同虚设——遇到类型报错,AI 的第一反应就是 as any

5. `console.log` 残留

console.log('here!!!', data);

console.log('debug:', result);

AI 在调试时写下大量 console.log,经常忘记清理。

6. TODO 占位符

# TODO: implement proper error handling

# TODO: add pagination

def fetch_users():

    return api.get('/users')

AI 写 TODO 很勤快,但实现 TODO 的是你。

7. 死代码

func oldHelper() string {

    return "this is never called"

}

AI 在迭代过程中经常留下旧版本函数的"尸体"——重构了但没删旧的。

8. 通用命名

const data = fetchData();

const result = processData(data);

const temp = transformResult(result);

dataresulttempitem——这些变量名在 100 行代码里出现 50 次,阅读体验灾难。

9. 重复辅助函数

def format_date_iso(d):

    return d.strftime('%Y-%m-%d')


# ... 200 lines later ...


def format_date_to_iso_string(dt):

    return dt.strftime('%Y-%m-%d')

AI 不记得自己之前写过什么,同一个功能写了两遍。

10. 幻影导入

import { NonExistentHelper } from './utils';

AI 幻觉出的模块路径——编译就报错,但 AI 自己不会去验证。

集成到你的工作流

1. Pre-commit 钩子

在提交前自动扫描:

# .pre-commit-config.yaml

repos:


  - repo: github.com/scanaislop/aislop

    rev: v0.9.4

    hooks:


      - id: aislop

每次 git commit 都会触发扫描,分数低于阈值则拒绝提交。

2. CI/CD 质量门禁

# .aislop/config.yml

ci:

  failBelow: 70

在 GitHub Actions 中:

- uses: actions/checkout@v4

- uses: actions/setup-node@v4

  with:

    node-version: 20


- run: npx aislop@latest ci .

如果分数低于 70,CI 直接失败,PR 无法合并。你也可以生成 SARIF 报告集成到 GitHub Code Scanning:

- run: npx aislop@latest scan . --sarif > aislop.sarif

- uses: github/codeql-action/upload-sarif@v3

  with:

    sarif_file: aislop.sarif

3. Claude Code 逐编辑钩子(最强用法)

这是 AISlop 最独特的集成方式——每次 Claude Code 编辑完代码后,自动扫描并将问题反馈给 Claude 自我修复:

# 安装钩子

npx aislop hook install --claude


# 带质量门禁(分数下降则阻止编辑)

npx aislop hook install --claude --quality-gate


# 查看已安装的钩子

npx aislop hook status

支持的 Agent 列表:claudecursorgeminipicodexwindsurfclinekilocodeantigravitycopilot

安装后,每次 AI 编辑都会触发:

  1. AISlop 扫描修改的文件
  2. 生成问题报告
  3. 反馈给 AI Agent 自我修复
  4. (质量门禁模式下)分数下降则阻止本次编辑

4. MCP Server 集成

把 AISlop 暴露为 MCP 工具,让 Claude Desktop、Cursor 等可以直接调用:

// ~/.cursor/mcp.json

{

  "mcpServers": {

    "aislop": {

      "command": "npx",

      "args": ["-y", "aislop-mcp"]

    }

  }

}

暴露的 MCP 工具:

  • aislop_scan
    :扫描代码并返回分数和问题列表
  • aislop_fix
    :自动修复机械性问题
  • aislop_why
    :解释某条规则为什么触发
  • aislop_baseline
    :设置/更新基线分数

MCP 实战流程:假设你在 Cursor 里用 Claude 写了一堆新代码,想知道质量如何。不用切到终端,直接在 Cursor 的 AI 对话里说:

"Run aislop_scan on src/components/"

AI 会自动调用 MCP 工具扫描该目录,返回分数和问题列表。然后你可以:

"Fix all the aislop issues you just found"

AI 会调用 aislop_fix 自动修复机械问题,再用 aislop_why 解释剩余问题——整个过程在编辑器内完成,无需切换窗口。

5. 团队协作工作流

▲ AI 代码质量三层防线:本地钩子→Pre-commit→CI 门禁

对于多人团队使用 AI 编程的场景,AISlop 提供了三层质量防线:

第一层:本地钩子——每个开发者的 AI Agent 写完代码后立即扫描。通过 npx aislop hook install --claude --quality-gate 确保本地分数不低于基线。

第二层:Pre-commit——代码提交前再次扫描暂存区文件:

npx aislop scan --staged

在 .pre-commit-config.yaml 中配置后,每次 git commit 自动执行。

第三层:CI 门禁——PR 合并前,CI 流水线全量扫描并对比基线:

# GitHub Actions


- run: npx aislop ci .

  env:

    AISLOP_BASELINE: 70

三层防线确保 AI 代码坏味道在进入主分支之前被多轮拦截。根据 AISlop 团队的研究数据,使用三层防线的团队,AI 代码坏味道密度比不使用任何检查的团队低 60% 以上。

6. 自动修复

AISlop 能自动修复格式化问题、未使用的导入、死代码等机械性问题:

# 安全自动修复

npx aislop fix


# 激进模式(包含依赖清理、未使用文件删除)

npx aislop fix -f

对于需要上下文的复杂问题,AISlop 会自动将诊断信息传给 AI Agent:

# 传给 Claude Code 修复

npx aislop fix --claude


# 传给 Cursor

npx aislop fix --cursor


# 传给 Gemini CLI

npx aislop fix --gemini


# 通用 prompt(适用于任何 Agent)

npx aislop fix --prompt

配置调优:避免噪音

刚跑 npx aislop scan 时,你可能会看到大量警告。这很正常——需要花 10 分钟调一下配置。

按规则调 severity

# .aislop/config.yml

rules:

  ai-slop/narrative-comment: warning   # 降为 warning,不阻塞

  ai-slop/trivial-comment: "off"       # 完全关闭此规则

  security/hardcoded-secret: error     # 提升为 error

排除文件

exclude:


  - "**/*.test.ts"      # 忽略测试文件

  - src/generated       # 忽略生成代码

  - "**/migrations/**"  # 忽略数据库迁移

扩展共享配置

团队可以维护一份基础配置,各项目继承:

# 项目 .aislop/config.yml

extends: ../../.aislop/base.yml

ci:

  failBelow: 80  # 覆盖基线的 CI 阈值

评分机制:为什么有些项目分低?

AISlop 的 0-100 评分是加权计算的。AI 坏味道(slop)的扣分权重大于风格问题。一般来说:

  • 90-100
    :代码质量优秀,几乎没有 AI 痕迹
  • 70-89
    :合格,有些小问题但可接受
  • 50-69
    :需要关注,AI 坏味道较多
  • <50
    :需要大幅整改

分数追踪:

# 查看分数历史趋势

npx aislop trend

每次 scan 都会在 .aislop/history.jsonl 中记录分数,trend 命令会打印历史表格和 ASCII 走势图。

踩坑与排障

1. 首次运行告警过多

初次扫描 500+ 文件的项目,可能看到几百条告警。不要慌——这是正常的。按以下步骤逐步处理:

  1. 先跑 npx aislop fix 自动修复机械性问题
  2. 查看规则列表 npx aislop rules,关闭不适合你项目的规则
  3. 调整 severity,把不阻塞的降为 warning
  4. 设置 CI 阈值从 50 开始,逐步提高

2. 与传统 Linter 的重复

AISlop 的 Formatting 和 Linting 引擎确实与传统工具(ESLint、Ruff、Biome)有重叠。如果项目已有完整的 Lint 配置,可以在 config 中关闭 Formatting 引擎,只保留 AI Slop 和 Security 引擎:

engines:

  formatting: false

  linting: false

这样 AISlop 就专注于传统 Linter 抓不到的 AI 特有模式。

3. 注释规则误杀

好的文档注释(JSDoc、docstring)不应该被标记。如果你的项目有规范的 API 文档注释,可以调整 narrative-comment 的阈值,或者给特定文件/目录加白名单。

4. Node.js 版本要求

AISlop 要求 Node.js ≥ 20。如果 CI 环境是 Node 18,需要先升级。

实战案例:一个真实项目的分数提升之路

▲ 项目分数提升实战:从 42 分到 76 分的完整路径

以一个中型 TypeScript 项目(约 200 个文件、3 万行代码)为例,该项目大量使用 Claude Code 进行开发:

阶段
操作
分数
初始扫描
npx aislop scan
42
自动修复
npx aislop fix -f
58
手动修复 20 个问题
逐一处理 error 级别
71
关闭不适用的 3 条规则
调 config
76
CI 门禁上线
failBelow: 70
稳定维持 72-78

从 42 到 76,整个过程不到 2 小时。大部分时间花在"AI 吞掉的异常"上——需要人工判断哪些确实可以忽略、哪些需要补错误处理。

常见问题(FAQ)

Q: AISlop 和 ESLint/Ruff 有什么区别? A: ESLint/Ruff 检查通用的代码规范,AISlop 额外检测 AI 特有的模式——叙事性注释、as any 逃逸、吞异常、TODO 占位符、幻影导入等。两者互补,不替代。

Q: 我不用 AI 写代码,还需要 AISlop 吗? A: 不需要。AISlop 的核心价值是检测 AI 代码模式。但要注意——你的团队成员可能在用 AI 写代码而你不知道。跑一次扫描看看分数,说不定有惊喜。

Q: 支持 Java 吗? A: 支持。AISlop 覆盖 TS/JS、Python、Go、Rust、Ruby、PHP、Java 共 7 种语言。

Q: 自动修复安全吗? A: fix(不加 -f)只修复格式化、未使用导入等完全安全的操作。fix -f 会额外删除未使用的文件和依赖,建议在单独分支上运行并 review diff。

Q: 如何让 AI Agent 主动遵守规则? A: 安装 per-edit hook:npx aislop hook install --claude --quality-gate。Claude Code 每次编辑后自动检查,分数下降就回退修改并告知原因。运行几轮后 AI 会学会避开这些模式。

Q: 为什么叫 "slop"?这个名字适合生产环境吗? A: "Slop" 是 AI 社区对低质量 AI 生成内容的俚称。如果你的团队对"slop"这个词有顾虑,可以用 @scanaislop/aislop 这个 npm 包名,内部命令和配置都是 aislop,不会在代码或 CI 日志中出现 "slop" 字样(除了 npm 包名)。

Q: 和 GitHub Copilot 的代码审查功能有冲突吗? A: 不冲突。GitHub Copilot 的代码审查侧重代码逻辑和最佳实践,AISlop 侧重 AI 特有的代码坏味道模式。两者可以同时运行——实际上 AISlop 支持 SARIF 输出,可以直接集成到 GitHub Code Scanning 中和 Copilot 的审查结果并列显示。

Q: 处理一个 10 万行代码的遗留项目,AISlop 要跑多久? A: 实测 10 万行 TypeScript 项目扫描时间约 2-5 秒(亚秒级引擎),瓶颈主要在依赖审计(npm audit 等)。可以关闭安全引擎中的依赖审计来加速:在 config 中设置 engines.security.dep_audit: false

行动建议

  1. 今天
    :在你的主项目中运行 npx aislop scan,看看 AI 代码占多少比例
  2. 本周
    :安装 --claude 或 --cursor hook,让 AI Agent 边写边修
  3. 本月
    :接入 CI 质量门禁,设置 failBelow: 70,防止 AI 坏味道进入主分支

⚠️ 风险提醒:AISlop 仍处于早期阶段(v0.9.4),规则和评分算法可能在后续版本中调整。建议锁定版本号(aislop@0.9.4)而非使用 @latest。部分规则(尤其是注释类)可能产生误报,上线前建议先在少量项目中试用一周。

 *参考来源:GitHub scanaislop/aislop;Ars Technica "Fed up with vibe coders, dev sneaks data-nuking prompt injection into their code"(2026 年 5 月);HN 讨论* 

#AI 创业 #Agent 工坊 #代码质量 #AI 编程 #工具推荐

本文由 AI 辅助创作,经人工审核编辑发布

【声明】内容源于网络
0
0
硅链AI
深圳硅链AI 专为企业管理咨询行业赋能,旨在通过尖端AI技术,为企业提供AI营销获客系统,AI智能客服系统,AI数字创始人IP打造系统,AI高效办公培训系统,AI全方位技术系统等为企业解决各种经营痛点。立即联系硅链AI开启早受益的赋能之旅。
内容 236
粉丝 0
硅链AI 深圳市硅基领航科技有限公司 深圳硅链AI 专为企业管理咨询行业赋能,旨在通过尖端AI技术,为企业提供AI营销获客系统,AI智能客服系统,AI数字创始人IP打造系统,AI高效办公培训系统,AI全方位技术系统等为企业解决各种经营痛点。立即联系硅链AI开启早受益的赋能之旅。
总阅读5.4k
粉丝0
内容236