mcpField
D
deslop

deslop

github.com/mikecann开发22203 次安装4 周前更新
代码仓库

关于 deslop

Deslop 是用于整理近期编写代码的技能,目标是在不改变行为的前提下提升清晰度。它规定了限定修改范围、遵循 style.md 和保留 API 的流程。

主要功能

  1. 01整理近期修改的代码
  2. 02保留行为和公共 API
  3. 03仅修改相关文件
  4. 04遵循 style.md 中的风格规则
  5. 05跳过生成文件和供应商代码
  6. 06总结修改与跳过的内容

适用场景

  1. 01简化当前会话中编写的代码
  2. 02在不改变行为的情况下精简条件逻辑
  3. 03整理代码时避免无关修改

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mikecann/agent-skills --skill deslop

安装后在 Claude Code 中输入/deslop确认已加载。

附带文件style.md

详细介绍

Deslop

将刚写好的代码整理得更紧凑、简洁,更显用心。

请先阅读 style.md。该文件是样式规则的权威依据。

流程

  1. 确定目标文件。
    • 从本次会话中修改过的文件开始。
    • 如果可以,使用 git diff;否则查看最近的编辑记录或用户明确列出的文件。
    • 不要改动无关文件。
  2. 编辑前阅读每个目标文件。
  3. 使用并行子 Agent 执行清理。
    • 如果有多个文件,将它们分配给不同的子 Agent。
    • 如果只有一个较大的文件,也可以安排一个子 Agent 单独进行第二轮检查。
    • 明确告知每个子 Agent 负责的文件。
    • 如果范围只有一到三个较小的文件,单轮处理即可。不要为了机械地满足规则而增加子 Agent 的开销。
  4. 告知每个子 Agent:
    • 阅读 skills/deslop/style.md
    • 只简化分配给自己的文件
    • 完全保留原有行为
    • 跳过只会增加改动、却不会让代码更清晰的修改
    • 简短汇报所做的修改和有意跳过的内容
  5. 检查子 Agent 的输出,应用修改,然后自行进行最终检查。
  6. 具体总结清理内容。
    • 示例:“扁平化了 3 个嵌套条件,将 2 个布尔变量重命名,并替换了 1 个非空断言”

约束

  • 绝不改变行为。这是样式清理,不是重构。
  • 如果样式规则与保留行为冲突,以保留行为为先。
  • 优先进行小范围的局部修改,避免大面积重写。
  • 如果只有深入进行架构重构才能显著改善代码,请停止,并说明原因,不要强行超出清理范围。
  • 跳过生成文件、供应商代码、构建产物和锁文件。
  • 除非用户要求,否则跳过测试。
  • 如果应用某条规则会降低代码可读性,就跳过该规则。
  • 保留导出的 API 和公共 API,除非用户明确要求修改 API。
  • 保留导出的 TypeScript 签名,除非用户明确要求修改类型或 API。
  • 如果代码已经很整洁,就说明这一点,不要强行修改。

优先检查的内容

  • 用保护子句替代嵌套条件
  • 用 if 加提前返回替代 else
  • 无需重新赋值时使用 const 而非 let
  • 通过缩窄类型或直接移除来替代 ! 非空断言
  • 用 Boolean(value) 或显式比较替代 !!value
  • 使用更清晰的布尔变量名,例如 isOpen、hasItems、canRetry
  • 缩短函数,让每个函数只负责一项明确工作
  • 精简编排函数,并提取辅助函数
  • 将查询/数据收集与操作/副作用分开
  • 让函数名准确说明其副作用
  • 使用小型纯函数拆分职责过多的 Hook 或组件
  • 使用对象参数替代过长的位置参数列表
  • 对判别联合进行穷尽处理
  • 使用提前返回扁平化 React 渲染分支
  • 逻辑只使用一次时,将 JSX 处理函数内联
  • 如果处理函数在多个地方复用,则继续将其提取到外部

错误示例与正确示例

// Bad: nested control flow and unnecessary else
function getLabel(user?: User) {
  if (user) {
    if (user.name) {
      return user.name;
    } else {
      return "Anonymous";
    }
  } else {
    return "Anonymous";
  }
}

// Good: early returns, flat flow
function getLabel(user?: User) {
  if (!user?.name) return "Anonymous";
  return user.name;
}
// Bad: hoisted one-off handler and && render
const handleClick = () => doSave();
return hasError && <ErrorBanner onRetry={handleClick} />;

// Good: inline simple handler and explicit null branch
return hasError ? <ErrorBanner onRetry={() => doSave()} /> : null;

检查清单

  • 已首先阅读 style.md
  • 只修改了相关文件
  • 在适当时使用了子 Agent 执行清理
  • 保留了原有行为
  • 有意跳过了部分修改
  • 最终总结说明了所做的修改

评论

支持 Markdown