140 lines
4.9 KiB
Markdown
140 lines
4.9 KiB
Markdown
---
|
||
description: 审查当前工作区未提交代码中的垃圾代码,并在不影响逻辑的前提下自动清理
|
||
argument-hint: 可选:指定要检查的文件或目录(默认检查所有未提交修改)
|
||
allowed-tools: ["Read", "Edit", "Bash", "Grep", "Glob"]
|
||
---
|
||
|
||
# /cleanup — 垃圾代码审查与清理
|
||
|
||
分析当前工作区(git diff)中的未提交代码,找出并修复常见垃圾代码,**不得改变任何运行逻辑**。
|
||
|
||
## 检查范围
|
||
|
||
若 `$ARGUMENTS` 非空,则只检查指定文件/目录;否则检查所有未提交修改(`git diff HEAD`)。
|
||
|
||
## 节省上下文规则
|
||
|
||
优先用确定性的 CLI 检查缩小范围,不要一上来把完整文件或大 diff 读入上下文:
|
||
|
||
```bash
|
||
git diff --name-only HEAD
|
||
git diff --unified=0 HEAD -- <path>
|
||
git diff --check
|
||
rg -n "TODO|FIXME|console\.log|debugger|print\(" <changed-paths>
|
||
```
|
||
|
||
只有 focused diff 不足以安全判断或修改时,才读取完整文件。
|
||
|
||
## 审查清单
|
||
|
||
按优先级检查以下问题(只报告在本次 diff 中**新增或修改**的代码里存在的问题):
|
||
|
||
### 1. 重复逻辑 (Duplicate Logic)
|
||
- 完全相同或高度相似的代码块在多处出现
|
||
- 同一函数/方法被多个地方各自实现,已有公共版本未被复用
|
||
- 相同的 DOM 查询、正则、模板字符串在同一文件重复
|
||
|
||
### 2. Magic Numbers / Magic Strings
|
||
- 裸数字直接参与计算(如偏移量、时间、尺寸、阈值),没有命名常量
|
||
- 硬编码字符串(如 id 名、状态值、URL 片段)散落在逻辑中
|
||
- 例外:`0`, `1`, `-1`, `100`, `""` 等语义明确的惯用值不算
|
||
|
||
### 3. 命名问题
|
||
- 含义不明的缩写变量(如 `or_`, `tmp2`, `x2`)
|
||
- 命名与实际用途不符
|
||
- 同一概念在不同地方用不同名字表达
|
||
|
||
### 4. 死代码 / 无效代码
|
||
- 注释掉的旧代码块(3行以上)
|
||
- 声明后从未使用的变量/参数/导入
|
||
- 永远不会执行的条件分支
|
||
|
||
### 5. 代码风格问题
|
||
- 尾部空白字符(trailing whitespace)
|
||
- 同一文件内风格不一致(如混用单双引号、缩进不统一)
|
||
- 空行使用不一致(连续多个空行等)
|
||
|
||
### 6. 其他常见问题
|
||
- 私有辅助函数应被 export 但没有,导致调用方重复实现
|
||
- 类型/接口重复定义
|
||
- 过于冗长的条件表达式可以简化(不改逻辑)
|
||
|
||
## 执行步骤
|
||
|
||
### Step 1 — 获取待检查文件列表
|
||
|
||
```bash
|
||
# 无参数时:获取所有未提交修改
|
||
git diff HEAD --name-only
|
||
|
||
# 有参数时:用 $ARGUMENTS 过滤
|
||
```
|
||
|
||
### Step 2 — 逐文件阅读并分析
|
||
|
||
先从 focused diff 开始:
|
||
|
||
```bash
|
||
git diff --unified=0 HEAD -- <file>
|
||
```
|
||
|
||
用 `rg`、`git diff --check`、编译器或 linter 输出确认确定性问题。只有需要上下文时才用 Read 读取完整文件。对照审查清单,记录每个问题:文件名、行号、问题类型、建议修复方式。
|
||
|
||
### Step 3 — 报告问题清单
|
||
|
||
在修改前,先以列表形式输出所有发现的问题:
|
||
|
||
```
|
||
发现 N 个问题:
|
||
|
||
[文件] js/foo.js
|
||
· L34, L78: 重复逻辑 — 两处都实现了相同的 DOM 查询,可提取到 getPanel()
|
||
· L91: Magic number — 硬编码 14 作为偏移量,应命名为 TOOLTIP_OFFSET
|
||
|
||
[文件] js/bar.js
|
||
· L12: 命名问题 — 变量 `or_` 语义不明,应命名为 outerR/outerG/outerB
|
||
...
|
||
```
|
||
|
||
如果没有发现问题,直接输出"未发现垃圾代码,当前代码质量良好。"并停止。
|
||
|
||
### Step 4 — 执行修复
|
||
|
||
对每个问题,使用 Edit 工具进行**最小化修改**:
|
||
|
||
- **重复逻辑**:提取为共享常量/函数,更新所有调用点
|
||
- **Magic number**:在文件顶部或逻辑附近声明 `const NAME = value`,替换所有引用
|
||
- **命名问题**:重命名变量,更新所有使用处
|
||
- **死代码**:直接删除
|
||
- **尾部空白/风格**:修正
|
||
- **未 export 的函数**:添加 `export`,在调用方改为导入(不重复实现)
|
||
|
||
**修复原则:**
|
||
- 只改在审查清单中发现的问题,不做额外优化
|
||
- 每次 Edit 只修改确实有问题的行,保持 diff 最小
|
||
- 改完后用 `grep` 验证旧的坏代码已消失
|
||
- 优先做精确补丁;只有仓库已有对应格式化流程时,才运行格式化工具
|
||
|
||
### Step 5 — 输出总结
|
||
|
||
```
|
||
清理完成:
|
||
|
||
修复了 N 个问题:
|
||
✓ earth.js — 提取重复 vertexShader 为 ATMOS_VERTEX_SHADER 常量
|
||
✓ main.js — 提取 TOOLTIP_CURSOR_OFFSET = 14(4处引用)
|
||
✓ controls.js — export updateLayerButtonState,移除 main.js 中的重复实现
|
||
...
|
||
|
||
未修改的问题(需人工确认):
|
||
! foo.js L45 — 注释代码块较长,建议手动确认是否可删除
|
||
```
|
||
|
||
## 约束
|
||
|
||
- **禁止**改变函数签名、接口定义、导出 API(除非问题正是私有函数应被 export)
|
||
- **禁止**添加新功能、新抽象、新参数
|
||
- **禁止**修改注释内容(只删除注释掉的死代码)
|
||
- **禁止**修改测试文件逻辑
|
||
- 如果一个 Magic number 的语义不完全确定,**跳过**,在总结中标记为"需人工确认"
|