- Add language code intelligent parsing module (internal/lang) - Support --lang parameter for target language specification - Support multiple language code formats (BCP47, aliases, Chinese names) - Implement interactive onboard configuration wizard - Update Config struct with language fields - Add survey library dependency for interactive UI - Improve CLI command interface - Add comprehensive unit tests for language module - Update documentation (AGENTS.md, changelog.md, taolun.md, memory.md) Supported language codes: - Standard: zh-CN, zh-TW, en-US, en-GB, ja, ko, es, fr, de - Aliases: cn, en, jp, kr, es, fr, de - Chinese names: chinese, english, japanese Commands: - yoyo "Hello world" - basic translation - yoyo --lang=cn "Hello world" - specify target language - yoyo onboard - start configuration wizard - yoyo onboard --force - force reconfiguration Version: 0.2.0
256 lines
6.7 KiB
Markdown
256 lines
6.7 KiB
Markdown
# 记忆纠正 (memory.md)
|
||
|
||
> 本文档记录开发过程中的重要定义、踩过的坑和经验总结,用于AI内部知识纠正。
|
||
|
||
## 使用说明
|
||
- 定期更新,特别是遇到问题后
|
||
- 按类别组织,便于查找
|
||
- 包含具体示例和解决方案
|
||
|
||
## 技术决策记录
|
||
|
||
### Go语言选择
|
||
**决策**: 使用Go语言而非Node.js或Deno
|
||
**原因**:
|
||
1. Go编译为单一二进制文件,部署方便
|
||
2. 性能优秀,适合CLI工具
|
||
3. 强大的标准库支持
|
||
4. 用户愿意学习Go
|
||
|
||
**影响**: 项目结构、依赖管理、开发工具链
|
||
|
||
---
|
||
|
||
### 面向对象设计
|
||
**决策**: 在Go中实现面向对象设计模式
|
||
**模式应用**:
|
||
1. **工厂模式**: ProviderFactory创建厂商实例
|
||
2. **策略模式**: Provider接口定义不同厂商策略
|
||
3. **依赖注入**: Translator依赖Provider接口
|
||
|
||
**注意事项**:
|
||
- Go中没有类,使用结构体
|
||
- 继承通过组合实现
|
||
- 多态通过接口实现
|
||
|
||
---
|
||
|
||
## 术语定义
|
||
|
||
### 厂商 (Provider)
|
||
指提供大模型API的服务商,如硅基流动、火山引擎等。每个厂商实现统一的`Provider`接口。
|
||
|
||
### 配置 (Config)
|
||
全局配置对象,包含API密钥、模型选择、超时设置等。使用YAML格式。
|
||
|
||
### 核心翻译器 (Translator)
|
||
负责协调配置、厂商和Prompt管理,执行翻译任务的核心类。
|
||
|
||
## 踩过的坑
|
||
|
||
### 环境变量加载问题
|
||
**问题**: 配置文件中的环境变量(如`${API_KEY}`)没有正确解析
|
||
**原因**: 没有实现环境变量替换功能
|
||
**解决方案**:
|
||
1. 使用`os.Getenv`读取环境变量
|
||
2. 在配置加载时进行字符串替换
|
||
3. 添加环境变量验证
|
||
|
||
**预防措施**:
|
||
- 在配置加载后验证所有必需的环境变量
|
||
- 提供清晰的错误信息
|
||
|
||
---
|
||
|
||
### 厂商API差异
|
||
**问题**: 不同厂商的API格式差异较大
|
||
**原因**: 每个厂商有自己的请求/响应格式
|
||
**解决方案**:
|
||
1. 定义统一的`TranslateRequest`和`TranslateResponse`
|
||
2. 在每个厂商实现中进行格式转换
|
||
3. 使用适配器模式
|
||
|
||
**经验**:
|
||
- 优先设计统一接口
|
||
- 将厂商特定逻辑封装在实现内部
|
||
- 提供原始响应用于调试
|
||
|
||
---
|
||
|
||
### 版本号管理混乱
|
||
**问题**: 版本号递增规则不明确
|
||
**原因**: 没有明确的版本管理规范
|
||
**解决方案**:
|
||
1. 采用语义化版本:主版本.次版本.修订版本
|
||
2. 第三位限制为00-99
|
||
3. 建立更新流程
|
||
|
||
**规范**:
|
||
- 小修复:修订版本+1
|
||
- 新功能:次版本+1,修订版本重置为00
|
||
- 重大变更:主版本+1,次版本和修订版本重置
|
||
|
||
---
|
||
|
||
### 环境变量加载问题
|
||
**问题**: 配置文件中的环境变量没有正确加载
|
||
**原因**: Go程序不会自动加载.env文件,需要使用第三方库
|
||
**解决方案**:
|
||
1. 使用`github.com/joho/godotenv`包
|
||
2. 在程序启动时调用`godotenv.Load()`
|
||
3. 将.env文件添加到.gitignore
|
||
|
||
**代码示例**:
|
||
```go
|
||
import "github.com/joho/godotenv"
|
||
|
||
func main() {
|
||
_ = godotenv.Load() // 加载.env文件
|
||
// 然后加载配置文件
|
||
}
|
||
```
|
||
|
||
**注意事项**:
|
||
- 不要提交真实的.env文件到版本控制
|
||
- 提供.env.example模板
|
||
- 在文档中说明环境变量配置方法
|
||
|
||
---
|
||
|
||
## 配置最佳实践
|
||
|
||
### 安全配置
|
||
- API密钥使用环境变量
|
||
- 不提交敏感信息到版本控制
|
||
- 提供`.env.example`模板
|
||
|
||
### 配置验证
|
||
- 启动时验证所有必需配置
|
||
- 提供有意义的错误信息
|
||
- 支持配置热重载(未来)
|
||
|
||
### 默认值策略
|
||
- 为非必需配置提供合理的默认值
|
||
- 默认值应在`config.setDefaults()`中设置
|
||
- 记录默认值的作用
|
||
|
||
---
|
||
|
||
## 开发工作流
|
||
|
||
### 日常开发流程
|
||
1. 从`dev`分支创建功能分支
|
||
2. 开发并测试功能
|
||
3. 更新相关文档(taolun.md、changelog.md)
|
||
4. 提交到功能分支
|
||
5. 合并到`dev`分支
|
||
6. 测试通过后合并到`main`
|
||
|
||
### 版本发布流程
|
||
1. 确保`dev`分支稳定
|
||
2. 更新版本号
|
||
3. 更新changelog.md
|
||
4. 创建版本标签
|
||
5. 合并到`main`分支
|
||
|
||
### 文档维护
|
||
- 每次重要讨论后更新taolun.md
|
||
- 每个版本更新changelog.md
|
||
- 遇到问题后更新memory.md
|
||
|
||
---
|
||
|
||
## 文档管理规范
|
||
|
||
### why.md (项目初衷文档)
|
||
**用途**: 记录项目初衷、愿景、目标和个人笔记
|
||
**编辑权限**: 只能由项目所有者(用户)编辑
|
||
**位置**: 项目根目录
|
||
**内容建议**:
|
||
- 项目愿景
|
||
- 核心问题
|
||
- 目标用户
|
||
- 期望功能
|
||
- 个人笔记
|
||
|
||
**注意事项**:
|
||
- AI不应修改此文件
|
||
- 文件内容反映创始人的个人想法
|
||
- 可以自由格式,不强制结构
|
||
|
||
### 文档协作规范
|
||
**taolun.md**: AI与用户共同维护的讨论记录
|
||
**changelog.md**: AI与用户共同维护的版本记录
|
||
**memory.md**: AI主导的知识纠正和经验总结
|
||
**why.md**: 用户专属的项目初衷文档
|
||
|
||
**编辑流程**:
|
||
1. 用户编辑why.md记录初衷
|
||
2. AI编辑taolun.md记录讨论
|
||
3. AI更新changelog.md记录版本
|
||
4. AI更新memory.md记录经验
|
||
|
||
---
|
||
|
||
## 语言代码处理经验
|
||
|
||
### 语言代码标准化
|
||
**问题**: 需要支持多种语言代码格式,但内部应使用标准格式
|
||
**解决方案**:
|
||
1. 使用BCP 47语言标签作为标准格式(如 `zh-CN`、`en-US`)
|
||
2. 实现智能解析函数 `ParseLanguageCode()`
|
||
3. 支持别名映射(如 `cn` → `zh-CN`、`en` → `en-US`)
|
||
|
||
**最佳实践**:
|
||
- 语言代码小写,地区代码大写(如 `zh-CN`,不是 `zh-cn`)
|
||
- 提供语言名称映射用于显示(如 `zh-CN` → "中文(简体)")
|
||
- 支持模糊匹配和建议功能
|
||
|
||
### 交互式配置经验
|
||
**问题**: 命令行工具需要友好的配置界面
|
||
**解决方案**:
|
||
1. 使用 `github.com/AlecAivazis/survey/v2` 库
|
||
2. 实现分步配置流程
|
||
3. 提供默认值和确认选项
|
||
|
||
**注意事项**:
|
||
- 交互式库需要终端支持
|
||
- 提供非交互式模式(如配置文件模板)
|
||
- 错误处理要友好,避免程序崩溃
|
||
|
||
### 命令行参数解析经验
|
||
**问题**: Go标准库 `flag` 包功能有限,需要支持子命令
|
||
**解决方案**:
|
||
1. 使用 `flag` 包解析选项参数
|
||
2. 手动处理子命令(如 `onboard`)
|
||
3. 提供清晰的帮助信息
|
||
|
||
**命名冲突处理**:
|
||
- 避免变量名与包名冲突(如 `onboard` 变量与 `onboard` 包)
|
||
- 使用后缀区分(如 `onboardFlag`)
|
||
|
||
## 配置文件管理经验
|
||
|
||
### 开发阶段配置策略
|
||
**决策**: 开发阶段使用 `.env` + `configs/config.yaml`
|
||
**原因**:
|
||
1. 简化开发环境配置
|
||
2. 符合12-factor应用原则
|
||
3. 避免过早优化
|
||
|
||
**实施**:
|
||
- `.env` 文件存储API密钥等敏感信息
|
||
- `configs/config.yaml` 存储复杂配置结构
|
||
- 使用环境变量替换 `${VAR}`
|
||
|
||
### 配置文件格式选择
|
||
**决策**: 使用YAML格式
|
||
**原因**:
|
||
1. 人类可读性好
|
||
2. 支持复杂数据结构
|
||
3. Go生态支持良好
|
||
|
||
**注意事项**:
|
||
- 使用 `gopkg.in/yaml.v3` 库
|
||
- 注意缩进和格式
|
||
- 提供配置验证 |