2026-04-11 22:32:43 +08:00
|
|
|
|
# hxclaw 更新日志
|
|
|
|
|
|
|
|
|
|
|
|
## 版本记录
|
|
|
|
|
|
|
2026-04-23 20:21:58 +08:00
|
|
|
|
### v0.1.0 (当前)
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
- [x] 流式输出功能
|
|
|
|
|
|
- [x] Markdown 渲染功能
|
|
|
|
|
|
- [x] 配置系统(支持用户配置和项目配置)
|
|
|
|
|
|
- [x] 代码中文注释
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### v0.2.0 (计划)
|
|
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
- [ ] 代码块渲染
|
|
|
|
|
|
- [ ] 表格渲染
|
|
|
|
|
|
- [ ] 列表渲染
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
|
|
|
|
|
### v0.3.0 (计划)
|
|
|
|
|
|
|
|
|
|
|
|
- [ ] 代码高亮
|
2026-04-23 20:11:22 +08:00
|
|
|
|
- [ ] 集成 glow 或类似库
|
|
|
|
|
|
- [ ] 支持常见语言语法高亮
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 认知纠正(踩坑记录)
|
|
|
|
|
|
|
|
|
|
|
|
### Go replace 机制不需要发布到 registry
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:最初担心需要像 npm 那样发布到 registry 才能被其他项目引用
|
|
|
|
|
|
|
|
|
|
|
|
**纠正**:Go 的 replace 机制可以直接指向:
|
|
|
|
|
|
- 本地路径(如 `../picoclaw`)
|
|
|
|
|
|
- GitHub 仓库 + tag(如 `github.com/sipeed/picoclaw v0.2.4`)
|
|
|
|
|
|
|
|
|
|
|
|
**知识点**:Go 模块不需要发布到任何 registry,GitHub 就是事实上的 registry
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### hxclaw 不需要实现全部 picoclaw 功能
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:最初担心需要自己实现 onboard、tools、mcp 等全部功能
|
|
|
|
|
|
|
|
|
|
|
|
**纠正**:hxclaw 是 CLI 增强层,只替换交互逻辑。picoclaw 的核心功能(agent loop、tools、mcp、skills)通过导入其 pkg 即可复用
|
|
|
|
|
|
|
|
|
|
|
|
**知识点**:采用组合优于继承的设计,需要什么功能就导入对应的包
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 流式输出需要判断 Provider 是否支持
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:不是所有 Provider 都支持流式输出
|
|
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**纠正**:需要使用类型断言判断 Provider 是否实现 `providers.StreamingProvider` 接口
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
|
|
|
|
|
**知识点**:picoclaw 的 Provider 设计使用了接口分离原则,流式是可选能力
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 终端渲染使用 charmbracelet 库
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:如何实现 Markdown 终端渲染
|
|
|
|
|
|
|
|
|
|
|
|
**纠正**:使用 charmbracelet 家族:
|
2026-04-23 20:11:22 +08:00
|
|
|
|
- glamour:Markdown 渲染
|
2026-04-11 22:32:43 +08:00
|
|
|
|
- lipgloss:样式定义
|
|
|
|
|
|
|
|
|
|
|
|
**知识点**:charmbracelet 是 Go 终端UI 的事实标准,API 设计优雅
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 独立二进制部署方式
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:hxclaw 和 picoclaw 的关系
|
|
|
|
|
|
|
|
|
|
|
|
**纠正**:hxclaw 作为独立二进制,用户可以同时保留两个命令:
|
|
|
|
|
|
- `picoclaw agent` 使用原版
|
|
|
|
|
|
- `hxclaw` 使用增强版
|
|
|
|
|
|
|
|
|
|
|
|
**知识点**:通过 go.mod replace 实现依赖绑定,用户无需安装 picoclaw 源码
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### onChunk 回调接收累积文本导致重复输出
|
|
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**问题**:picoclaw 的 `StreamingProvider` 接口定义 `onChunk func(accumulated string)`,注释说明每次回调时参数是累积的完整文本(如 "你好" → "你好!再次" → "你好!再次见到"),而不是增量。
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**纠正**:使用 `printedLen` 跟踪已打印位置,只打印新增部分
|
2026-04-11 22:32:43 +08:00
|
|
|
|
|
|
|
|
|
|
**知识点**:picoclaw 故意设计为累积文本,这样可以在任意时刻获取完整内容用于调试
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-11 23:57:38 +08:00
|
|
|
|
### spinner 组件的 model 更新必须使用返回值
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:spinner 动画不动
|
|
|
|
|
|
|
|
|
|
|
|
**现象**:调用 spinner.Update(msg) 后动画不更新
|
|
|
|
|
|
|
|
|
|
|
|
**纠正**:spinner model 是值类型,需要使用返回值更新:
|
|
|
|
|
|
```go
|
2026-04-23 20:11:22 +08:00
|
|
|
|
s.spinner, _ = s.spinner.Update(msg) // 必须使用返回值更新
|
2026-04-11 23:57:38 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**知识点**:bubbletea v2 的组件遵循 TEA 架构模式,Update 方法返回更新后的 model,需要显式使用返回值。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### spinner 和流式输出在同一行的冲突问题
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:spinner 使用 `\r` 回到行首刷新,流式输出也在同一行打印,导致内容混在一起
|
|
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**纠正**:在第一个 token 时停止 spinner,让 spinner 输出 "思考完成." 并换行,然后再开始流式打印
|
2026-04-11 23:57:38 +08:00
|
|
|
|
|
|
|
|
|
|
**知识点**:spinner 和流式输出需要分时工作,不能同时占用同一行。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
### 配置系统设计
|
2026-04-11 23:57:38 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**问题**:用户需要自定义主题、延迟等配置,但项目配置只有一份
|
2026-04-11 23:57:38 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**纠正**:设计多级配置系统:
|
|
|
|
|
|
- 用户配置:`~/.config/hxclaw/config.yml`(优先级最高)
|
|
|
|
|
|
- 项目配置:`project.config.yml`
|
|
|
|
|
|
- 环境变量:`HXCLAW_CONFIG` 指定路径
|
|
|
|
|
|
- 代码默认值
|
|
|
|
|
|
|
|
|
|
|
|
**合并规则**:用户配置优先于项目配置,项目配置优先于默认值
|
|
|
|
|
|
|
|
|
|
|
|
**实现**:`mergeConfig` 函数实现配置合并逻辑
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 代码注释规范
|
|
|
|
|
|
|
|
|
|
|
|
**问题**:代码缺少注释,后续维护困难
|
2026-04-11 23:57:38 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**纠正**:所有代码添加详细中文注释:
|
|
|
|
|
|
- 包级别注释
|
|
|
|
|
|
- 结构体注释
|
|
|
|
|
|
- 字段注释(使用行内注释 `//`)
|
|
|
|
|
|
- 函数注释
|
|
|
|
|
|
- 关键逻辑注释
|
2026-04-11 23:57:38 +08:00
|
|
|
|
|
2026-04-23 20:11:22 +08:00
|
|
|
|
**知识点**:详细注释是团队协作和后续维护的基础
|