起因
朋友推了一个开源项目 DeepSeek-TUI,一个跑在终端里的 DeepSeek 编程 Agent。让我看看有什么能借鉴的。
看完挑了两个觉得有价值的:
- Plan 模式 — 模型先列计划,用户确认再动手
- Rollback — 每个操作有回退策略,不满意一键退回
按照我以前的习惯,该建文件了:加 Checklist 规范、写 rollback 脚本、建备份目录、定义 /rollback 命令……
但这次我多问了一句:能不能不做加法做减法?
思路反转
Plan 和 Rollback 的本质不是工具,是一个习惯:
复杂任务先列计划、设计回退手段、用户点头再执行。
AGENTS.md 的执行策略表,原来有三行:
| 任务类型 | 执行方式 |
|---|---|
| 简单任务 | 直接执行 |
| 复杂任务 | 预读 + 子代理分析 |
| 开发任务 | dev-orchestrator |
改动就一行:把"复杂任务"的执行方式改成 “先列计划+回退方案,用户确认再执行”,然后把"开发任务"的关键词并进去。
一行字解决的事情,不需要建文件、不需要写脚本、不需要定义命令。
然后我回头看了看现有的 8 个技能——既然在做减法,干脆一起减。
第一轮:拆技能
删 skill-orchestrator
这个技能叫"技能自动触发器",核心功能是判断任务类型然后转发给 dev-orchestrator。
SKILL.md 自己写得很诚实:“转发 dev-orchestrator 9 步 SOP”。
它就是一个路由器。而路由逻辑已经在 AGENTS.md 里了。
减掉:一个技能目录。
server-manager 改名 → sucaddy-ops
这个技能只服务 sucaddy 项目(内网 overlay 网络运维),叫 server-manager 太泛了。改名 sucaddy-ops,触发词聚焦到 sucaddy 相关。
version-check 合并进 health-check
原来有 4 个脚本:health-check.sh、deploy.sh、version-check.sh、distribute.sh。
version-check.sh 做的事是收集各节点二进制文件的 md5,对比一致性。但 health-check.sh 已经逐节点输出 md5,只是不汇总。
给它加了个 --version 参数,version-check 就不需要独立存在了。
减掉:1 个脚本。
auto-memory 的 venv
auto-memory(记忆检索)和 speech-to-text(语音转录)各自独立装了一套 FunASR + PyTorch。
结果:auto-memory 的 venv 287MB,speech-to-text 的 venv 908MB。
而 auto-memory 本来就在调 speech-to-text 的 HTTP API。它根本不需要自己的 venv。
减掉:287MB。
清垃圾
翻了一圈发现每个技能目录都有 CHANGELOG.md 和 MANIFEST.md。翻了一下 OpenClaw 官方的 skill-creator 规范,明确写着:
Do NOT create extraneous documentation or auxiliary files, including: CHANGELOG.md
官方说别建这些文件,但我们每个技能都有。
减掉:5 个 CHANGELOG + 4 个 MANIFEST + 4 个旧日志。
第二轮:拆 dev-orchestrator
dev-orchestrator 是一个 9 步开发 SOP:
需求澄清 → 设计评审 → 任务拆解 → 编码 prompt → 测试 prompt → 审查 prompt → 代码标准检查 → 文档同步 → Git 提交
22 个文件,bin/src/tests/utils 全齐。
但我仔细看了一下——这 9 步做的事情,模型自己全都会。
| 步骤 | 做什么 | 模型不靠技能能做吗? |
|---|---|---|
| 1. 需求澄清 | 结构化需求文档 | ✅ |
| 2. 设计评审 | 技术方案 | ✅ |
| 3. 任务拆解 | DAG 依赖推导 | ✅ |
| 4. 编码 prompt | 生成 prompt 模板 | ✅ |
| 5. 测试 prompt | 同上 | ✅ |
| 6. 审查 prompt | 同上 | ✅ |
| 7. 代码标准检查 | CODE_STANDARDS.md 合规 | ✅ |
| 8. 文档同步 | 已违反官方规范 | |
| 9. Git 提交 | Conventional Commits | ✅ |
第 8 步"文档同步"在自动生成 CHANGELOG.md——就是官方明确禁止的那个文件。
更离谱的是,这 22 个文件里还有 5 个 utils 文件 0 引用:
| 文件 | 行数 | 引用数 |
|---|---|---|
| utils/errors.mjs | 232 | 0 |
| utils/git-ops.mjs | 232 | 0 |
| utils/notify.mjs | 211 | 0 |
| utils/task-tracker.mjs | 298 | 0 |
| utils/logger.mjs | 2 | 0 |
975 行代码,没有一个函数被调用过。 还硬编码了旧电脑的路径。
先做了减法——砍掉死代码、砍 CHANGELOG 生成、砍 MANIFEST 生成。删了 ~1800 行。
然后想了想:剩下的部分跟 AGENTS.md 的"先列计划+回退方案"有什么区别?
开发任务本质上就是复杂任务的一种。审核代码架构和开发新功能,思考链路一样,只是输出物不同。
砍掉整个 dev-orchestrator,AGENTS.md 里多一行:“开发任务额外关注 CODE_STANDARDS.md”。
减掉:25 个文件,8970 行代码,一个技能。
最终结果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 技能数 | 8 | 5 |
| AGENTS.md 执行策略 | 3 行 | 2 行 |
| 净删代码 | — | ~15,000 行 |
| 净删文件 | — | 76 个 |
| 省磁盘 | — | ~290MB |
| 功能损失 | — | 零 |
5 个保留的技能:
sucaddy-ops ← sucaddy 运维(3 脚本)
speech-to-text ← 语音转录(FunASR)
auto-memory ← 记忆检索
blog-manager ← 博客管理
_shared ← 共享依赖
AGENTS.md 执行策略:
| 任务类型 | 关键词 | 执行方式 |
|---|---|---|
| 简单任务 | 读、查看、列出、运行、检查 | 直接执行 |
| 复杂任务 | 审核、分析、对比、研究、开发、实现、重构 | 先列计划+回退方案,用户确认再执行 |
感悟
1. 加法是本能,减法是功力
看到新项目的特性,第一反应是"我也加一个"。但加之前问一句"能不能不新建文件"——答案往往是可以。
2. 官方规范不是建议,是约束
OpenClaw 的 skill-creator 明确说 “Do NOT create CHANGELOG.md”,但我们每个技能都有。说明代码会偏离规范,而且偏离了自己不会回来。定期审计是必须的。
3. 最贵的代码是没人用的代码
dev-orchestrator 里 975 行死代码(0 引用),占 utils/ 目录的绝大部分。这些代码不会出错,不会报警,不会拖慢性能——但它们占用认知带宽。每次读代码都要跳过它们。
4. 技能是工具,不是资产
一个技能的存在理由是"不可替代"。skill-orchestrator 不可替代吗?不,AGENTS.md 一行就够了。dev-orchestrator 不可替代吗?不,模型自己会写代码、会测试、会提交。
能写进 AGENTS.md 的技能,就不该独立存在。
Git 记录
ede048f 删 dev-orchestrator:9 步 SOP → AGENTS.md 复杂任务纪律
3fce2eb dev-orchestrator 减法:删 5 死 utils + 2 templates + CHANGELOG/MANIFEST 生成逻辑
9db5282 减法优化:删 skill-orchestrator + 合并 version-check + 清垃圾文件 + Plan/Rollback 纪律
简洁是基础,高效是要求,稳定是底线,安全是红线。