easyai 1.7.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/AGENTS.md +10 -8
- data/CLAUDE.md +211 -126
- data/README.md +176 -36
- data/easyai.gemspec +12 -9
- data/lib/easyai/base/secret_masker.rb +39 -0
- data/lib/easyai/base/system_info.rb +17 -203
- data/lib/easyai/command/ai_tool_base.rb +218 -0
- data/lib/easyai/command/backup/claude.rb +124 -0
- data/lib/easyai/command/backup.rb +23 -0
- data/lib/easyai/command/claude.rb +72 -357
- data/lib/easyai/command/clean.rb +90 -395
- data/lib/easyai/command/codex.rb +39 -0
- data/lib/easyai/command/gemini.rb +23 -41
- data/lib/easyai/command/restore/claude.rb +150 -0
- data/lib/easyai/command/restore.rb +24 -0
- data/lib/easyai/command/setup.rb +487 -378
- data/lib/easyai/command/update.rb +39 -188
- data/lib/easyai/command/utils.rb +2 -7
- data/lib/easyai/command.rb +1 -3
- data/lib/easyai/config/local_config.rb +161 -0
- data/lib/easyai/version.rb +1 -1
- data/lib/easyai.rb +29 -35
- metadata +20 -37
- data/lib/easyai/auth/authclaude.rb +0 -519
- data/lib/easyai/auth/jpsloginhelper.rb +0 -98
- data/lib/easyai/base/system_keychain.rb +0 -283
- data/lib/easyai/command/gpt.rb +0 -259
- data/lib/easyai/command/utils/export.rb +0 -263
- data/lib/easyai/config/config.rb +0 -357
- data/lib/easyai/config/easyai_config.rb +0 -258
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e0e9e5abc64041d1ca3e0a9fb59a81aa3dcdd16edfdfa716069fa17a71df1f4b
|
|
4
|
+
data.tar.gz: b729e5453a287e1e7fb6908fba42bd4516e48800eafff811d4b0fea80bb83653
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f5fa95bca000bf57323f11026e5392b90fa71d22f606e77ddf49e87420afe1b128ef8313e3c51e6940bec15a177df3bc1ba7b81de532613c23cd394556a1c2f4
|
|
7
|
+
data.tar.gz: a4b24f06ec5dfa6ea7ed8a7476619eb580f4b606151e22a0921ad7a6760775e8ee5202e7832d7bfca2a8c470664e57daa0be0ac1944ca55d3b82e502a0c779de
|
data/AGENTS.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Repository Guidelines
|
|
2
2
|
|
|
3
3
|
## 项目结构与模块组织
|
|
4
|
-
- Ruby 源码位于 `lib/` 根目录,核心入口在 `lib/easyai.rb`,基础能力集中于 `lib/easyai/base
|
|
5
|
-
-
|
|
6
|
-
- CLI 启动脚本是 `bin/easyai
|
|
7
|
-
-
|
|
4
|
+
- Ruby 源码位于 `lib/` 根目录,核心入口在 `lib/easyai.rb`,基础能力集中于 `lib/easyai/base`(`file_crypto` / `system_info` / `cross_platform` / `version_checker` / `update_notifier`),命令定义在 `lib/easyai/command` 及其子目录(`claude.rb` / `gemini.rb` / `codex.rb` / `setup.rb` / `clean.rb` / `update.rb` / `utils.rb` + `utils/{encry,decry}.rb`,公共基类 `ai_tool_base.rb`)。
|
|
5
|
+
- 本地配置门面位于 `lib/easyai/config/local_config.rb`(管理 `~/.easyai/config.json`);版本号定义于 `lib/easyai/version.rb` 并由 `easyai.gemspec` 消费。
|
|
6
|
+
- CLI 启动脚本是 `bin/easyai`;打包产物默认输出在项目根目录。辅助脚本位于 `script/` 目录:`install_local.sh`/`install_local.bat` 承担本地构建安装,`local_release.sh` 负责本地完整发布,`autoci_release.sh` 将构建推送交由 Gitee CI 完成;请保留可执行权限并在修改后记录变更。
|
|
7
|
+
- 测试位于 `spec/` 目录,已按模块拆分子目录:`spec/config`、`spec/command`(`spec/base` 将于阶段 9.1 补全),公共助手与 fixture 位于 `spec/support`(含 `tmpdir_helper.rb` / `stdin_helper.rb` / `fixtures/`)。
|
|
8
8
|
|
|
9
9
|
## 架构概览
|
|
10
10
|
- `EasyAI::EasyAIApp` 负责命令调度、启动横幅与版本检查,所有 CLI 子命令最终由 `EasyAI::Command` 树处理。
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
- `bundle install`:安装 Gemfile 中的开发依赖(Rake、RSpec 等),首次克隆或更新依赖后必须执行。
|
|
16
16
|
- `bundle exec rspec`:运行整个测试套件;可通过 `bundle exec rspec spec/command/claude_spec.rb` 定位单个文件调试,或使用 `--format documentation` 获取更详细输出。
|
|
17
17
|
- `bundle exec rake build` 或 `gem build easyai.gemspec`:构建 gem 包,常用于发布前的本地验证;`bundle exec rake install` 可直接将构建产物安装到本地。
|
|
18
|
-
- `./
|
|
18
|
+
- `./script/install_local.sh`:自动执行打包并安装到本地 Ruby 环境,适合冒烟回归;`./script/local_release.sh` 覆盖提交流程、分支同步和 `gem push`,仅在确认要发布时运行,并保证当前分支已同步远程;`./script/autoci_release.sh` 仅负责提交与打 tag,构建推送由 Gitee CI 处理。
|
|
19
19
|
|
|
20
20
|
## 语言与风格规范
|
|
21
21
|
- 本项目要求所有代码、注释、提交信息与文档统一使用中文,PR 描述与讨论亦应遵循;如必须引用英文原文,请附中文解释,确保沟通无障碍。
|
|
@@ -24,10 +24,12 @@
|
|
|
24
24
|
- 新增命令时,参照现有文件创建 `lib/easyai/command/<name>.rb`,并在 `lib/easyai.rb` 中显式 `require`,确保自动加载链条完整;必要时补充文档说明。
|
|
25
25
|
|
|
26
26
|
## 测试准则
|
|
27
|
-
-
|
|
28
|
-
-
|
|
27
|
+
- `spec/` 已建立,**发布前必跑 `bundle exec rspec` 全绿(硬性门槛)**;新增 / 修改功能遵循 TDD:先在 `spec/<模块>/` 下补测试 → 实现 → 全绿后提交。
|
|
28
|
+
- 使用 RSpec 进行行为驱动测试,文件命名为 `<feature>_spec.rb`;`describe` 中强调用户视角,例如 CLI 参数解析、配置加载或版本更新提示。
|
|
29
|
+
- 隔离副作用:涉及 `~/.easyai/config.json` 的测试统一通过 `with_isolated_home` 把 `ENV['HOME']` 指向 tmpdir;交互输入用 `with_stdin`,输出抓取用 `capture_stdout`(均在 `spec/support/`)。
|
|
30
|
+
- 对加密、配置清理等高风险逻辑,建立 fixture(统一放在 `spec/support/fixtures`)并测试成功与失败路径;必要时模拟外部命令退出码。
|
|
29
31
|
- 目标是保持修改行的单元测试覆盖率不下降;若引入重要分支逻辑,请添加针对性例子并在 PR 中说明覆盖情况。
|
|
30
|
-
-
|
|
32
|
+
- 若修改了打包或权限脚本,除 `bundle exec rspec` 外请额外执行 `./script/install_local.sh` 验证安装流程,并记录输出结果。
|
|
31
33
|
|
|
32
34
|
## 提交与合并请求规范
|
|
33
35
|
- 提交消息遵循 `feat:`、`fix:`、`refactor:`、`res x.y.z` 等前缀,小写冒号后加空格,主题控制在 72 字符以内,正文补充动机与影响面。
|
data/CLAUDE.md
CHANGED
|
@@ -4,186 +4,271 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
4
4
|
|
|
5
5
|
**重要说明:此项目的所有回答和交流都应该使用中文。**
|
|
6
6
|
|
|
7
|
+
## 文档索引
|
|
8
|
+
|
|
9
|
+
| 文档 | 说明 |
|
|
10
|
+
|------|------|
|
|
11
|
+
| [README.md](README.md) | 项目入口,安装与常用命令 |
|
|
12
|
+
| [docs/需求文档.md](docs/需求文档.md) | 功能与非功能需求(v2.0) |
|
|
13
|
+
| [docs/设计文档.md](docs/设计文档.md) | 架构、模块与关键流程(v2.0) |
|
|
14
|
+
| [docs/plan.md](docs/plan.md) | v2.0 重构实施计划(任务拆解 + 决策摘要) |
|
|
15
|
+
| [AGENTS.md](AGENTS.md) | 团队协作与提交规范 |
|
|
16
|
+
|
|
7
17
|
## 项目概述
|
|
8
18
|
|
|
9
|
-
EasyAI 是一个 Ruby CLI
|
|
19
|
+
EasyAI 是一个 Ruby CLI 包装器,为 Anthropic Claude、Google Gemini、OpenAI Codex 三家命令行工具提供统一入口。v2.0 起聚焦**单机本地化**:通过 `~/.easyai/config.json` 集中管理多家工具与多平台凭证、代理配置;运行时把环境变量仅注入子进程,不污染当前 shell。
|
|
10
20
|
|
|
11
21
|
## 常用命令
|
|
12
22
|
|
|
13
|
-
###
|
|
23
|
+
### 开发与测试
|
|
24
|
+
|
|
14
25
|
```bash
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
26
|
+
bundle install # 安装开发依赖
|
|
27
|
+
bundle exec rspec # 运行测试套件(发布前必跑)
|
|
28
|
+
bundle exec rspec spec/config # 跑某个目录
|
|
29
|
+
./script/install_local.sh # 本地构建并安装 gem(冒烟)
|
|
30
|
+
ruby -Ilib bin/easyai --help # 开发期手测
|
|
31
|
+
|
|
32
|
+
# 调试相关环境变量
|
|
33
|
+
EASYAI_DEBUG=1 ruby bin/easyai claude # 调试日志
|
|
34
|
+
EASYAI_VERBOSE=1 easyai claude # 详细输出
|
|
35
|
+
EASYAI_SKIP_FORCE_UPDATE=1 easyai claude # 跳过版本强制阻塞
|
|
36
|
+
```
|
|
18
37
|
|
|
19
|
-
|
|
20
|
-
./release_remote.sh # 完整发布:git 操作、gem 构建和发布到 RubyGems
|
|
38
|
+
### AI 工具启动
|
|
21
39
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
40
|
+
```bash
|
|
41
|
+
easyai claude # 多平台时交互选择
|
|
42
|
+
easyai claude --platform=kimi # 显式指定平台
|
|
43
|
+
easyai claude ./adhoc.json # 位置参数:用一次性 JSON 覆盖(单平台扁平 schema)
|
|
44
|
+
easyai gemini # 同上
|
|
45
|
+
easyai codex # 替代 v1.x 的 easyai gpt
|
|
46
|
+
```
|
|
25
47
|
|
|
26
|
-
|
|
27
|
-
EASYAI_TEST_PASSWORD=testdir123 easyai utils encry /tmp/test_dir
|
|
28
|
-
EASYAI_TEST_PASSWORD=testdir123 easyai utils decry /tmp/test_dir_encrypted
|
|
48
|
+
> 一次性 JSON 是**位置参数**(不是 `--config=` 选项);该模式下 `--platform` 被忽略。
|
|
29
49
|
|
|
30
|
-
|
|
31
|
-
EASYAI_DEBUG=1 ruby bin/easyai claude # 启用调试信息输出
|
|
32
|
-
EASYAI_SKIP_FORCE_UPDATE=1 easyai claude # 跳过版本更新检查
|
|
33
|
-
EASYAI_VERBOSE=1 easyai claude # 启用详细输出模式
|
|
34
|
-
```
|
|
50
|
+
> 上面的 `kimi` 仅为示例。`--platform` 可用值由用户 `~/.easyai/config.json` 的 `platforms` 字典决定;新增平台模板的权威列表见 `lib/easyai/command/setup.rb` 的 `KNOWN_PLATFORMS`。**不要在文档或代码注释里硬编码平台名清单**(如 `claude_official / kimi / deepseek`),会随模板更新漂移。
|
|
35
51
|
|
|
36
52
|
### 配置管理
|
|
37
|
-
```bash
|
|
38
|
-
# 交互式设置 API 令牌和初始化
|
|
39
|
-
easyai setup # 一键配置初始化
|
|
40
|
-
easyai --setup # 旧版设置命令
|
|
41
53
|
|
|
42
|
-
|
|
43
|
-
easyai
|
|
54
|
+
```bash
|
|
55
|
+
easyai setup # 全量交互(首次)/ 选择菜单 upsert(已存在)
|
|
56
|
+
easyai setup --tool=claude # 只配置某个工具
|
|
57
|
+
easyai setup --add=kimi --tool=claude # 追加或覆盖单平台
|
|
58
|
+
easyai setup --remove=kimi --tool=claude # 删除单平台
|
|
59
|
+
easyai setup --list # 脱敏概览
|
|
60
|
+
easyai setup --edit # 用 $EDITOR 直接编辑
|
|
61
|
+
easyai setup --reset # 删除现有 config.json 后重走交互
|
|
62
|
+
```
|
|
44
63
|
|
|
45
|
-
|
|
64
|
+
> 配置位置:`~/.easyai/config.json`(v2.0 起)。v1.x 的 `~/.easyai/config.yml` 不会自动迁移。
|
|
46
65
|
|
|
47
|
-
|
|
48
|
-
easyai claude ./config.json # 加载指定的 JSON 配置文件
|
|
66
|
+
### 清理 AI CLI 缓存
|
|
49
67
|
|
|
50
|
-
# 导出配置信息
|
|
51
|
-
easyai utils export # 自动生成文件名(使用邮箱地址)
|
|
52
|
-
easyai utils export --output=config.json # 指定输出文件名
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 清理功能
|
|
56
68
|
```bash
|
|
57
|
-
easyai clean
|
|
58
|
-
easyai clean
|
|
69
|
+
easyai clean # 默认清 claude
|
|
70
|
+
easyai clean codex # 单工具
|
|
71
|
+
easyai clean all # 三家一起清
|
|
72
|
+
easyai clean all --dry-run # 预览
|
|
73
|
+
easyai clean all --force # 跳过确认
|
|
59
74
|
```
|
|
60
75
|
|
|
76
|
+
> `clean` 只清各 AI CLI 自身缓存(如 `~/.claude.json`),不会动 `~/.easyai/config.json`(重置 EasyAI 自身配置请用 `easyai setup --reset`)。
|
|
77
|
+
|
|
61
78
|
## 架构设计
|
|
62
79
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
###
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
80
|
+
代码库基于 CLAide 框架,v2.0 起采用单层 LocalConfig + AIToolBase 抽象的精简架构:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
应用入口 EasyAI::EasyAIApp (lib/easyai.rb)
|
|
84
|
+
│ · 启动 banner · 强制版本检查(update 子命令时跳过)
|
|
85
|
+
▼
|
|
86
|
+
命令层 EasyAI::Command 树 (lib/easyai/command/)
|
|
87
|
+
├── AIToolBase (抽象) 公共流程(platform / env / proxy / exec)
|
|
88
|
+
│ ├── Claude / Gemini / Codex 每子类约 15 行
|
|
89
|
+
├── Setup / Clean / Update
|
|
90
|
+
└── Utils (抽象) ← Encry / Decry
|
|
91
|
+
▼
|
|
92
|
+
配置层 EasyAI::Config::LocalConfig (lib/easyai/config/local_config.rb)
|
|
93
|
+
· load / save / resolve_platform / upsert / delete
|
|
94
|
+
▼
|
|
95
|
+
存储层 ~/.easyai/config.json (用户私有,chmod 600)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**基础层** `lib/easyai/base/`:
|
|
99
|
+
- `file_crypto.rb` — AES-128-ECB 加解密(仅供 `utils encry/decry`)
|
|
100
|
+
- `system_info.rb` — 跨平台 OS 判定与 `which_command`
|
|
101
|
+
- `cross_platform.rb` — Windows/Unix 命令差异封装
|
|
102
|
+
- `secret_masker.rb` — 敏感字段脱敏(key 名含 `TOKEN`/`KEY`/`SECRET`/`PASSWORD` 时,按"前 4 + ... + 后 4 + 长度"脱敏;`--list` / `print_platform_env` 共用)
|
|
103
|
+
- `version_checker.rb` / `update_notifier.rb` — RubyGems 版本检查与升级提示
|
|
104
|
+
|
|
105
|
+
详细的模块职责、数据流、错误降级矩阵见 [docs/设计文档.md](docs/设计文档.md)。
|
|
106
|
+
|
|
107
|
+
### AI 工具运行流程
|
|
108
|
+
|
|
109
|
+
`AIToolBase#run` 模板:
|
|
110
|
+
|
|
111
|
+
1. argv 解析:`--platform` / `--verbose` / **第一个 `.json` 位置参数 → 本地覆盖** / 其余透传给目标 CLI
|
|
112
|
+
2. `validate!` 检查 `exec_command` 在 PATH 中
|
|
113
|
+
3. `resolve_config`:本地覆盖文件优先;否则走 `LocalConfig.resolve_platform`
|
|
114
|
+
4. `print_platform_env`:打印当前生效的 `env` / `proxy`(敏感字段经 `Base::SecretMasker` 脱敏),让用户在 exec 前肉眼确认
|
|
115
|
+
5. `build_environment`:merge `env` + `proxy`(同时设大小写 `HTTP_PROXY/http_proxy`)
|
|
116
|
+
6. `export_environment_variables`:写入当前进程 ENV,**保护 `PATH/HOME/USER/SHELL` 不被覆盖**
|
|
117
|
+
7. `exec(env, exec_command, *@passthrough_args)` 进程替换
|
|
118
|
+
|
|
119
|
+
### 配置 schema (v2.0.0)
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"version": "2.0.0",
|
|
124
|
+
"<tool>": {
|
|
125
|
+
"platforms": {
|
|
126
|
+
"<platform_name>": {
|
|
127
|
+
"env": { "<KEY>": "<VALUE>", ... },
|
|
128
|
+
"proxy": { "HTTP_PROXY": "...", "HTTPS_PROXY": "..." }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`<tool>` ∈ `claude` / `gemini` / `codex`;`platforms` 字典即真相,runtime 不维护硬编码白名单。**`setup.rb` 的 `KNOWN_PLATFORMS` 是唯一的平台模板权威列表**(用于 `setup` 交互引导);代码注释、option 描述、文档都应避免另写一份平台名清单,需要举例时统一以"见 `setup.rb` 的 `KNOWN_PLATFORMS`"代替。
|
|
111
136
|
|
|
112
137
|
### 版本更新机制
|
|
113
|
-
|
|
114
|
-
-
|
|
115
|
-
-
|
|
116
|
-
-
|
|
138
|
+
|
|
139
|
+
- `EasyAIApp#run` 启动时同步检查 RubyGems 版本,过期则阻塞
|
|
140
|
+
- 跳过条件:`--help` / `--version` / `--check-update` / `EASYAI_SKIP_FORCE_UPDATE=1` / **子命令为 `update`**(避免死循环)
|
|
141
|
+
- `easyai update` 用 `system('gem','update','easyai')` 实现(非 `exec`,便于打印结尾提示)
|
|
142
|
+
|
|
143
|
+
## 测试 (RSpec)
|
|
144
|
+
|
|
145
|
+
v2.0 起 `spec/` 目录已建立,**发布前必须 `bundle exec rspec` 全绿**(硬性门槛)。
|
|
146
|
+
|
|
147
|
+
### 目录结构
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
spec/
|
|
151
|
+
├── spec_helper.rb 关闭 colored2 染色、注入 lib/、加载 support/、include 助手
|
|
152
|
+
├── support/
|
|
153
|
+
│ ├── tmpdir_helper.rb with_isolated_home / install_fixture_config
|
|
154
|
+
│ ├── stdin_helper.rb with_stdin / capture_stdout
|
|
155
|
+
│ └── fixtures/ config_v2_full.json / config_v2_minimal.json / config_corrupted.json
|
|
156
|
+
├── config/
|
|
157
|
+
│ └── local_config_spec.rb LocalConfig 单测
|
|
158
|
+
├── command/
|
|
159
|
+
│ ├── ai_tool_base_spec.rb AIToolBase 模板流程
|
|
160
|
+
│ ├── claude_spec.rb / gemini_spec.rb / codex_spec.rb
|
|
161
|
+
│ ├── setup_spec.rb 交互 / upsert / 脱敏 / 删除
|
|
162
|
+
│ └── clean_spec.rb CACHE_PATHS / --dry-run / --force
|
|
163
|
+
└── base/
|
|
164
|
+
└── file_crypto_spec.rb 加解密 round-trip(阶段 9.1 补全)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 助手快速参考
|
|
168
|
+
|
|
169
|
+
- `with_isolated_home { |home| ... }` — 把 `ENV['HOME']` 重定向到 tmpdir,块结束自动清理
|
|
170
|
+
- `install_fixture_config(name, home)` — 把 `support/fixtures/<name>` 复制为 `<home>/.easyai/config.json`
|
|
171
|
+
- `with_stdin('a', 'b') { ... }` — 把多行内容注入 `$stdin`
|
|
172
|
+
- `capture_stdout { ... }` — 收集 `$stdout` 输出并返回字符串
|
|
173
|
+
|
|
174
|
+
### TDD 工作流
|
|
175
|
+
|
|
176
|
+
新增 / 修改功能必须遵循:
|
|
177
|
+
|
|
178
|
+
1. 先在 `spec/<模块>/` 下补 / 改测试,本地 `bundle exec rspec spec/<模块>` 看到红
|
|
179
|
+
2. 编写或修改实现,跑到全绿
|
|
180
|
+
3. 跑全量 `bundle exec rspec` 确认无回归
|
|
181
|
+
4. 再提交(提交说明里附上测试结果)
|
|
117
182
|
|
|
118
183
|
## 版本管理
|
|
119
184
|
|
|
120
|
-
版本在 `lib/easyai/version.rb`
|
|
185
|
+
版本在 `lib/easyai/version.rb` 中定义,更新 `VERSION` 常量即可。
|
|
121
186
|
|
|
122
187
|
### 发布流程
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
188
|
+
|
|
189
|
+
`script/local_release.sh`(本地完整发布):
|
|
190
|
+
1. 提交所有未提交更改
|
|
191
|
+
2. 合并到 master
|
|
192
|
+
3. 构建 + 安装 gem
|
|
193
|
+
4. 创建并推送 Git 标签 `v<版本号>`
|
|
194
|
+
5. `gem push` 到 RubyGems
|
|
195
|
+
|
|
196
|
+
`script/autoci_release.sh`(CI 自动发布):
|
|
197
|
+
1. 本地完成提交 / 合并 / 打 tag / 推送
|
|
198
|
+
2. Tag 推送触发 `.workflow/EasyAIRelease.yml` 在 Gitee CI 上构建并 `gem push`
|
|
129
199
|
|
|
130
200
|
## CLAide 框架注意事项
|
|
131
201
|
|
|
132
|
-
### argv.remainder
|
|
133
|
-
|
|
202
|
+
### `argv.remainder!` 调用时机
|
|
203
|
+
|
|
204
|
+
**重要**:`argv.remainder!` 必须在 `super` 之后执行。
|
|
134
205
|
|
|
135
|
-
正确示例:
|
|
136
206
|
```ruby
|
|
137
207
|
def initialize(argv)
|
|
138
208
|
super
|
|
139
|
-
@args = @argv.remainder! # ✅
|
|
209
|
+
@args = @argv.remainder! # ✅ super 之后调用,使用 @argv
|
|
140
210
|
end
|
|
141
211
|
```
|
|
142
212
|
|
|
143
|
-
原因:`argv.remainder!` 会消耗并清空 argv
|
|
213
|
+
原因:`argv.remainder!` 会消耗并清空 argv,若在 `super` 之前调用,父类无法获取 `--help` 等标志。
|
|
144
214
|
|
|
145
215
|
### 命令类继承结构
|
|
216
|
+
|
|
146
217
|
```
|
|
147
218
|
CLAide::Command
|
|
148
219
|
└── EasyAI::Command (abstract_command = true)
|
|
149
|
-
├──
|
|
150
|
-
├──
|
|
151
|
-
├──
|
|
220
|
+
├── AIToolBase (abstract) ← 公共流程
|
|
221
|
+
│ ├── Claude
|
|
222
|
+
│ ├── Gemini
|
|
223
|
+
│ └── Codex
|
|
224
|
+
├── Setup
|
|
152
225
|
├── Clean
|
|
153
226
|
├── Update
|
|
154
|
-
|
|
155
|
-
└── Utils (abstract_command = true)
|
|
227
|
+
└── Utils (abstract)
|
|
156
228
|
├── Encry
|
|
157
|
-
|
|
158
|
-
└── Export
|
|
229
|
+
└── Decry
|
|
159
230
|
```
|
|
160
231
|
|
|
161
232
|
## 添加新命令的标准流程
|
|
162
233
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
234
|
+
### 添加新的 AI 工具子命令
|
|
235
|
+
|
|
236
|
+
1. 创建 `lib/easyai/command/<name>.rb`,继承 `EasyAI::Command::AIToolBase`
|
|
237
|
+
2. 实现三个抽象方法:`tool_name` / `exec_command` / `install_hint`
|
|
238
|
+
3. 设置中文 `self.summary` / `self.description`
|
|
239
|
+
4. 在 `lib/easyai.rb` 中 `require 'easyai/command/<name>'`
|
|
240
|
+
5. 在 `lib/easyai/command/setup.rb` 的 `KNOWN_PLATFORMS` 中添加该工具的平台模板
|
|
241
|
+
6. 在 `lib/easyai/command/clean.rb` 的 `CACHE_PATHS` 中添加该工具缓存路径
|
|
242
|
+
7. 更新 README、设计文档命令矩阵
|
|
243
|
+
8. 在 `spec/command/` 下补测试
|
|
244
|
+
|
|
245
|
+
### 添加普通子命令(非 AI 工具)
|
|
246
|
+
|
|
247
|
+
1. 创建 `lib/easyai/command/<name>.rb`,继承 `EasyAI::Command`
|
|
248
|
+
2. 设置 `self.summary` / `self.description`(中文)
|
|
249
|
+
3. 实现 `initialize`(注意 `super` 与 `argv.remainder!` 顺序)
|
|
250
|
+
4. 实现 `validate!`(可选)+ `run`
|
|
251
|
+
5. 在 `lib/easyai.rb` 中 require
|
|
252
|
+
6. 在 `spec/command/` 下补测试
|
|
170
253
|
|
|
171
254
|
### 输出格式规范
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
- `
|
|
176
|
-
- `
|
|
255
|
+
|
|
256
|
+
各命令使用统一输出格式:
|
|
257
|
+
|
|
258
|
+
- `print_status(icon_text, detail)` — 状态信息,图标左对齐,详情用 cyan
|
|
259
|
+
- `print_success(message)` — 绿色 ✓
|
|
260
|
+
- `print_warning(message)` — 黄色 ⚠
|
|
261
|
+
- `print_error(message)` — 红色 ✗
|
|
177
262
|
|
|
178
263
|
## 中文化要求
|
|
179
264
|
|
|
180
|
-
-
|
|
181
|
-
-
|
|
265
|
+
- **所有用户界面必须使用中文**:命令描述、选项说明、错误信息、交互提示、状态信息
|
|
266
|
+
- **所有项目文档必须使用中文**:README.md、代码注释、提交信息
|
|
182
267
|
|
|
183
|
-
##
|
|
268
|
+
## 安全约束
|
|
184
269
|
|
|
185
|
-
|
|
186
|
-
-
|
|
187
|
-
-
|
|
188
|
-
-
|
|
189
|
-
-
|
|
270
|
+
- `~/.easyai/config.json` 包含 API Key 明文,`save` 后会自动 `chmod 600`(非 Windows)
|
|
271
|
+
- 敏感字段(key 名含 `TOKEN` / `KEY` / `SECRET` / `PASSWORD`):
|
|
272
|
+
- 输入用 `IO#noecho` 不回显
|
|
273
|
+
- `--list` 输出做"前 4 + 后 4 + 长度"脱敏
|
|
274
|
+
- 不得把 `~/.easyai/config.json` 上传到代码仓库或日志服务
|