ZeroClaw 可优化空间与改进建议
1. 结论先行
这个项目最主要的问题不是“方向不清楚”,而是“功能已经很多,核心文件和核心配置开始过重”。
换句话说,它现在更像一个需要系统化拆分和治理的成熟工程,而不是需要推翻重做的项目。
2. 优先级最高的问题
P0:先解决结构性膨胀
2.1 关键文件过大
我在当前仓库快照里直接统计到的几个重点文件行数如下:
| 文件 | 行数 | 问题 |
|---|---|---|
src/config/schema.rs | 14917 | 所有配置几乎都堆在一个文件里 |
src/channels/mod.rs | 11136 | 渠道工厂、共享逻辑、运行态行为过度集中 |
src/agent/loop_.rs | 8702 | Agent 主循环职责过多 |
src/onboard/wizard.rs | 7220 | onboarding 逻辑过重 |
src/providers/mod.rs | 3442 | Provider 工厂和别名/构造逻辑持续膨胀 |
src/gateway/mod.rs | 3316 | 路由、状态装配和 HTTP 逻辑集中 |
src/security/policy.rs | 3092 | 安全策略、风险判断、速率控制耦合较深 |
为什么这是大问题
- 合并冲突风险高
- 新人难以定位职责
- 单文件测试难拆
- 局部重构时牵一发动全身
- 很容易继续向“万能文件”方向失控
建议拆分方式
src/config/schema.rs
按领域拆为:
config/core.rsconfig/agent.rsconfig/gateway.rsconfig/security.rsconfig/channels.rsconfig/tools.rsconfig/providers.rsconfig/hardware.rs
保留schema.rs只做 re-export 和统一入口。
src/channels/mod.rs
拆为:
channels/factory.rschannels/runtime.rschannels/session.rschannels/reload.rschannels/shared_dispatch.rs
src/agent/loop_.rs
拆为:
agent/turn_loop.rsagent/tool_loop.rsagent/streaming.rsagent/history_compaction.rsagent/recovery.rs
src/gateway/mod.rs
拆为:
gateway/router.rsgateway/state.rsgateway/webhooks.rsgateway/admin.rsgateway/middleware.rs
P0:缩小Config的耦合范围
当前Config能力很强,但副作用是很多模块都容易“顺手拿整份配置”。
问题
- 模块不容易只依赖自己真正需要的配置
- 测试构造配置对象成本高
- 新配置容易被继续往大对象里加
建议
- 各子系统函数优先接收自己需要的 slice,例如
&GatewayConfig、&AgentConfig - 工厂函数不要默认传整份
Config - 配置校验分层做:顶层校验 + 子系统自校验
P0:错误处理与可观测性再收紧
仓库自带的docs/maintainers/refactor-candidates.md已经点出了几个问题,我同意这些判断:
- 生产代码里仍有
unwrap()/panic!()风险 - 有些路径存在
let _ = ...式静默吞错 - 某些 crate 级
#[allow(...)]抑制范围过大
建议
- 非测试代码优先改为
Result+context(...) - 对关键异步发送失败至少做
tracing::warn! - 全局
allow改为局部allow,并写清原因
P0:安全路径的测试深度还可以再补
项目已经有比较完整的安全体系,但安全逻辑越多,越需要更强的行为测试。
优先补测试的区域
- shell 命令校验
- pairing / token / lockout
- prompt guard / leak detector
- webhook 签名验证
- 路径边界和 sandbox 选择
- credential scrubber
建议测试手段
- 单元测试
- 集成测试
- property-based testing
- fuzz testing
尤其是fuzz/目录已经存在,说明项目方向上也认同这条路。
3. 第二优先级问题
P1:工具、Provider、Channel 的注册方式继续模块化
当前三大工厂都已经非常重:
providers/mod.rschannels/mod.rstools/mod.rs
问题
- 新增一类能力时,修改点集中在巨型工厂里
- 条件编译、配置、依赖装配混在一起
- 阅读门槛高
建议
- 为 Provider/Tool/Channel 建元数据注册表
- 工厂只负责按 metadata + config 选择构造器
- 把别名、描述、feature gate、默认参数收敛为静态注册项
理想形态更像:
Registry Entry -> id -> aliases -> feature gate -> constructor -> capability metadataP1:前端构建与 Rust 编译耦合可以更可控
build.rs当前会在条件满足时自动跑npm ci和npm run build。这个体验对“最终用户很方便”,但对“开发和 CI 可预期性”有代价。
风险
- Rust 编译过程掺杂前端依赖安装
- Node 环境差异会影响后端构建
- 首次构建时间会不可预测
可以优化的方式
- 提供明确开关,例如
ZEROCLAW_SKIP_WEB_BUILD=1 - CI 里固定前端产物流程
- 日常本地开发把前端构建前置到单独命令
不过这一点也要平衡易用性,不能为了“纯粹”把用户体验做差。
P1:Gateway API 可以进一步分层
Gateway 已经承担很多职责:
- REST API
- Pairing
- Webhook
- SSE
- WebSocket
- Static files
- Admin endpoints
建议
- 路由定义和 handler 分离得更彻底
- AppState 进一步拆成几个子状态
- API DTO 单独目录化
- 配对/设备管理独立成子模块族
P1:文档体系可以再治理
文档非常丰富,这是优点,但docs/i18n/占比过高,也意味着同步成本高。
建议
- 继续清理重复/过时翻译
- 让“用户文档”和“维护者文档”边界更清晰
- 给每个主文档加最后校验时间
- 对 README、配置参考、命令参考做更明确的单一事实源
4. 第三优先级问题
P2:功能集过宽,适合做发行档位分层
当前工程同时覆盖:
- 个人助手
- Web 控制台
- 桌面端
- 多消息平台
- 企业工具集成
- 硬件外设
- 固件
- RAG
- SkillForge
- WASM 插件
建议
可以考虑做更清晰的构建档位:
| 档位 | 建议内容 |
|---|---|
core | CLI + agent + gateway + sqlite memory |
ops | 加 scheduler、service、observability |
channels | 加主流消息通道 |
hardware | 加 peripherals、hardware、firmware 相关 feature |
full | 全量能力 |
这样可以更贴近“低资源部署”的产品承诺。
P2:桌面端和 Web 端的产品边界可再明确
当前桌面端本质上是 Gateway 的壳,这个思路没问题,但可以更明确:
- 桌面端负责托盘、自动配对、状态感知、启动器
- 真正业务页面仍由 Gateway 统一提供
建议把这个设计写进更显眼的位置,减少误解。
5. 一个现实可执行的重构路线
如果我是维护者,我会按下面顺序推进,而不是一次性大改。
第一阶段
- 拆
config/schema.rs - 拆
channels/mod.rs - 给安全敏感路径补测试
第二阶段
- 拆
agent/loop_.rs - 把 Provider/Tool/Channel 工厂元数据化
- 清理静默吞错与全局 allow
第三阶段
- 收敛前端构建流程
- 优化 docs/i18n 结构
- 设计更清晰的 feature preset / edition
6. 我认为最值钱的优化方向
如果只允许做三件事,我会选:
- 拆
config/schema.rs、channels/mod.rs、agent/loop_.rs - 给安全关键链路补行为测试和 fuzz
- 把注册工厂机制做成更清晰的 registry
原因很简单:
- 这三件事同时改善可维护性
- 降低回归风险
- 不会改变产品方向
- 对后续继续扩功能最有帮助
7. 总结
ZeroClaw 现在的状态很像“功能成熟、架构正确、但需要治理复杂度”的项目。
它不是需要推倒重来,而是需要持续做减耦、拆分、补测试和整理注册机制。
从二开角度看,它非常有价值。
从维护角度看,越往后越不能继续把新能力直接堆进巨型文件里。
