用途:查找代码库中的重复代码,并在确实能降低复杂度时进行合并。该技能强调只有令牌完全一致、体量可观的重复块才自动提取;较小或已有分歧的重复通常不应 DRY 化,过早抽象可能比三行相似代码更糟。\n\n主要能力:使用 jscpd 做跨 150 多种语言的克隆检测,按信号噪声比过滤(丢弃 node_modules、dist、build、.next、generated、生成文件、彼此镜像的测试文件、纯类型定义与迁移文件中的匹配),产出带统计与逐条克隆分析的评估报告,并只对高置信项自动提取。\n\n使用方式:先做前置检查——语言检测、Git 状态(脏工作树拒绝自动应用)、确保 .claude/cleanup-reports/ 存在、读取项目共享工具约定(lib/、utils/、shared/、common/、package 等目录,提取代码放入其中)。随后执行检测:\nbunx jscpd --min-tokens 70 --min-lines 30 --threshold 0 --reporters json --output /tmp/jscpd-out . 2>/dev/null \\n || npx jscpd --min-tokens 70 --min-lines 30 --reporters json --output /tmp/jscpd-out .\n解析 /tmp/jscpd-out/jscpd-report.json,其中每个重复条目含 firstFile、secondFile、lines、tokens 与片段。然后评估并写入 .claude/cleanup-reports/cleanup-dedupe-{YYYY-MM-DD}.md,包含摘要、克隆列表与批判性评估。\n\n置信度规则:HIGH(自动应用)需 ≥30 LOC 且 ≥70 tokens、令牌完全一致、函数签名相同或无需改参数即可归并、跨同一工作区边界或已有明确共享包、且不在测试/夹具/生成代码中;MEDIUM 仅报告(1-3 处分歧、需新建共享包、15-29 LOC 边界情况);LOW 只记录不处理(结构性相似、测试样板)。应用时仅处理 HIGH:确定目标位置(同包用现有 lib/ 或 utils/,不同包用已有共享包,否则升级为 MEDIUM,不自动新建包)、创建新工具文件、替换两处源引用、删除原代码,并单次提交 chore(cleanup): cleanup-dedupe — extracted N shared utilities。\n\n验证:运行\nbun run check 2>&1 || npx tsc --noEmit && npx eslint .\nbun test 2>&1 || pytest 2>&1\n再重跑 jscpd 确认减少;若验证失败则回滚并把全部降级为 MEDIUM。输出包含提取数量、节省 LOC、延迟项数量、报告路径与验证状态。\n\n限制与绝不事项:不从生成文件、.d.ts、迁移文件提取;不自动创建共享包;不因 prop 模式相似就提取 React/Vue 组件;不强制需要修改任一源文件函数签名的抽象;不对两个相似测试用例 DRY 化;不提取各位置错误处理或副作用不同的代码。
cleanup-dedupe
编程与开发
更新于 10-16 04:57