easyai 1.2.1 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bff981d82a8e6f1993636f8cc70ea1737b0709ef9b43a475f04781da0a6a5c53
4
- data.tar.gz: f965d82c23c91c6e9796eb8e14f460297b851dda5822f9d1d8537e5447564c3d
3
+ metadata.gz: 11409804e9d550fb82f6b2d4735c288383430a08f0c8d552c5402359e8eace69
4
+ data.tar.gz: 3d4afb321b908167b5023b6ea88b0f41d04f352c24dc05243ca439f4d6080ffe
5
5
  SHA512:
6
- metadata.gz: d455373705c7a3a862f42d909b2808585df70d0fcb4821851caed028c685aaa5e84e083ffa3ccf2e2184dda1136269c4edc06e3368410d3813667579f900d1c6
7
- data.tar.gz: c0de6189651a35d9c63c3626e4e3967ef4c0fb9b8e5969f047291f126672b4229cf9e181c08382217cdde04b4e506e4af970c5f025a341ed51864e6491a4e947
6
+ metadata.gz: f1e5f980648640cea13741fdf15abb62153295c61a21c4fee74ca37431cc81addbf09a507c51591db2cedac86ca057916aa205bd190cad56910f2e5e5e1a3ee0
7
+ data.tar.gz: a857e396b2f0a2db95369cff98b13ec72ebdd3f3396e4da471d8f0b8a44b6614688c6cccb22f1e2f0ac53dfaf9d257db605eb504c9248e6b1e1e8a997c0a946d
data/CLAUDE.md CHANGED
@@ -6,27 +6,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
6
6
 
7
7
  ## 项目概述
8
8
 
9
- EasyAI 是一个 Ruby CLI 工具,作为 AI 命令行工具(Claude、Gemini、GPT)的包装器。它提供环境隔离和配置管理功能,允许用户使用预配置的 API 令牌和代理设置运行 AI 工具,而不会影响系统环境变量。项目还包含实用工具集合,如文件加密解密功能。
9
+ EasyAI 是一个 Ruby CLI 工具,作为 AI 命令行工具(Claude、Gemini、GPT)的包装器。它提供环境隔离和配置管理功能,允许用户使用预配置的 API 令牌和代理设置运行 AI 工具,而不会影响系统环境变量。项目还包含实用工具集合,如文件加密解密和配置导出功能。
10
10
 
11
- ## 架构设计
12
-
13
- 代码库采用基于 CLAide 的模块化架构:
14
-
15
- - **应用入口 (`lib/easyai.rb`)**:`EasyAIApp` 类负责启动标志显示、版本检查和命令执行
16
- - **主命令 (`lib/easyai/command.rb`)**:抽象基础命令,处理全局选项和帮助信息
17
- - **AI 工具子命令 (`lib/easyai/command/*.rb`)**:每个 AI 工具(claude、gemini、gpt)都有自己的命令类,继承自主命令
18
- - **工具命令 (`lib/easyai/command/utils/`)**:实用工具集合,包括文件加密解密功能
19
- - **认证模块 (`lib/easyai/auth/`)**:处理 AI 工具的认证配置,如 `authclaude.rb`
20
- - **配置管理 (`lib/easyai/config/`)**:管理配置文件的加载、保存和远程下载
21
- - **基础模块 (`lib/easyai/base/`)**:
22
- - `file_crypto.rb`:文件加密解密核心实现
23
- - `system_keychain.rb`:系统钥匙串访问
24
- - `version_checker.rb`:版本检查和更新
25
- - `update_notifier.rb`:更新通知显示
26
- - **环境隔离**:使用 Ruby 的 `exec()` 替换当前进程为目标 AI 工具,在注入环境变量的同时保持交互性
27
- - **跨平台支持**:处理 Unix(`which`)和 Windows(`where`)之间的命令检测差异
28
-
29
- ## 关键命令
11
+ ## 常用命令
30
12
 
31
13
  ### 开发和测试
32
14
  ```bash
@@ -48,234 +30,108 @@ EASYAI_TEST_PASSWORD=testdir123 easyai utils decry /tmp/test_dir_encrypted
48
30
  # 调试模式
49
31
  EASYAI_DEBUG=1 ruby bin/easyai claude # 启用调试信息输出
50
32
  EASYAI_SKIP_FORCE_UPDATE=1 easyai claude # 跳过版本更新检查
33
+ EASYAI_VERBOSE=1 easyai claude # 启用详细输出模式
51
34
  ```
52
35
 
53
36
  ### 配置管理
54
37
  ```bash
55
- # 交互式设置 API 令牌
56
- easyai --setup
38
+ # 交互式设置 API 令牌和初始化
39
+ easyai setup # 一键配置初始化
40
+ easyai --setup # 旧版设置命令
57
41
 
58
42
  # 显示配置文件位置
59
43
  easyai --config
60
44
 
61
- # 配置文件:~/.easyai/config.yml
45
+ # 配置文件位置:~/.easyai/config.yml
62
46
 
63
47
  # 使用本地配置文件
64
48
  easyai claude ./config.json # 加载指定的 JSON 配置文件
49
+
50
+ # 导出配置信息
51
+ easyai utils export # 自动生成文件名(使用邮箱地址)
52
+ easyai utils export --output=config.json # 指定输出文件名
65
53
  ```
66
54
 
67
- ### 工具命令
55
+ ### 清理功能
68
56
  ```bash
69
- # 文件加密解密
70
- easyai utils encry <文件/目录路径> [输出路径] # 加密文件或目录
71
- easyai utils decry <文件/目录路径> [输出路径] # 解密文件或目录
72
-
73
- # 清理功能
74
- easyai clean # 清理临时文件和缓存
57
+ easyai clean # 清理 Claude 配置缓存
58
+ easyai clean all # 清理所有配置(Claude、Gemini、GPT)
75
59
  ```
76
60
 
77
- ## 核心实现细节
61
+ ## 架构设计
62
+
63
+ 代码库采用基于 CLAide 的模块化架构:
64
+
65
+ - **应用入口 (`lib/easyai.rb`)**:`EasyAIApp` 类负责启动标志显示、版本检查和命令执行
66
+ - **主命令 (`lib/easyai/command.rb`)**:抽象基础命令,处理全局选项和帮助信息
67
+ - **AI 工具子命令 (`lib/easyai/command/*.rb`)**:每个 AI 工具(claude、gemini、gpt)都有自己的命令类,继承自主命令
68
+ - **工具命令 (`lib/easyai/command/utils/`)**:实用工具集合,包括文件加密解密(encry/decry)和配置导出(export)功能
69
+ - **设置命令 (`lib/easyai/command/setup.rb`)**:一键配置初始化命令
70
+ - **认证模块 (`lib/easyai/auth/`)**:处理 AI 工具的认证配置
71
+ - `authclaude.rb`:Claude 认证管理
72
+ - `jpsloginhelper.rb`:JPS 客户端登录助手,提供统一的 JPS 认证接口
73
+ - **配置管理 (`lib/easyai/config/`)**:管理配置文件的加载、保存和远程下载
74
+ - `config.rb`:传统配置管理
75
+ - `easyai_config.rb`:新一代配置仓库管理,支持自动下载、更新和解密远程配置
76
+ - **基础模块 (`lib/easyai/base/`)**:
77
+ - `file_crypto.rb`:文件加密解密核心实现(AES-128-ECB)
78
+ - `system_keychain.rb`:系统钥匙串访问
79
+ - `version_checker.rb`:版本检查和更新
80
+ - `update_notifier.rb`:更新通知显示
81
+ - **环境隔离**:使用 Ruby 的 `exec()` 替换当前进程为目标 AI 工具,在注入环境变量的同时保持交互性
78
82
 
79
83
  ### 环境变量注入
80
84
  每个子命令在调用 `exec()` 前合并环境变量:
81
85
  - Claude: `CLAUDE_CODE_OAUTH_TOKEN`
82
- - Gemini: `GOOGLE_API_KEY`, `GEMINI_API_KEY`
86
+ - Gemini: `GOOGLE_API_KEY`, `GEMINI_API_KEY`
83
87
  - OpenAI: `OPENAI_API_KEY`
84
88
  - 代理: `HTTP_PROXY`, `HTTPS_PROXY`, `http_proxy`, `https_proxy`
85
89
 
86
- ### 命令验证
87
- 每个子命令使用平台特定检测验证目标 CLI 工具是否已安装:
88
- - Unix/Linux/macOS: `which <command> > /dev/null 2>&1`
89
- - Windows: `where <command> >nul 2>&1`
90
-
91
- ### 进程替换策略
92
- 使用 `exec(env, command, *args)` 而非 `system()` 来:
93
- - 完全替换当前进程(无子进程)
94
- - 保留 stdin/stdout/stderr 用于交互式工具
95
- - 透明处理 Ctrl+C 和其他信号
96
- - 保持与直接运行工具相同的用户体验
97
-
98
- ### 文件加密系统
99
- 基于 AES-128-ECB 的文件加密功能 (`lib/easyai/base/file_crypto.rb`):
100
- - **单文件加密**:支持任意文件类型,输出 `.encrypted` 文件
101
- - **目录批量加密**:递归加密目录中所有文件,保持原有目录结构
102
- - **智能解密**:自动识别 `.encrypted` 文件并恢复原文件名
103
- - **密码管理**:支持交互式密码输入和环境变量密码(`EASYAI_TEST_PASSWORD`)
104
- - **错误处理**:完整的错误处理和用户友好提示
105
-
106
90
  ### 认证优先级机制
107
- AI 工具的认证令牌获取优先级(`lib/easyai/auth/authclaude.rb`):
108
- 1. **远程配置**:首先尝试下载远程配置文件
91
+ AI 工具的认证令牌获取优先级:
92
+ 1. **远程配置**:首先尝试通过 `EasyAIConfig` 下载并解密远程配置文件
109
93
  2. **本地配置**:如果指定了本地 JSON 配置文件,加载该文件
110
94
  3. **系统钥匙串**:从系统钥匙串获取(macOS Keychain)
111
95
  4. **环境变量**:从环境变量读取(如 `CLAUDE_CODE_OAUTH_TOKEN`)
112
96
  5. **交互输入**:最后提示用户输入并保存到配置文件
113
97
 
98
+ ### 配置管理系统
99
+
100
+ **EasyAIConfig** - 配置仓库管理:
101
+ - 自动从 `https://gitee.com/goodtools/EasyAISetting.git` 下载和更新配置仓库
102
+ - 智能分支选择:测试环境使用 dev 分支,生产环境使用 master 分支
103
+ - 智能解密:对比文件时间戳,按需解密
104
+ - 自动清理:使用后自动清理解密文件
105
+
106
+ **ConfigManager** - 业务配置逻辑:
107
+ - 支持多工具类型(claude、gemini、gpt)
108
+ - 支持多认证平台(claude_auth、kimi_auth、deepseek_auth)
109
+ - 智能平台选择和用户交互
110
+ - 复杂加密配置的密码验证机制
111
+
114
112
  ### 版本更新机制
115
- 项目包含智能版本管理系统 (`lib/easyai/base/version_checker.rb`):
116
113
  - **启动检查**:在 `EasyAIApp#run` 中自动执行版本检查
117
114
  - **强制更新**:`check_force_update!` 方法会阻塞执行直到检查完成
118
- - **同步检查**:`check_sync` 方法复用已获取的版本信息
119
- - **更新通知**:`UpdateNotifier` 模块负责显示更新提示
120
- - **跳过机制**:
121
- - 设置 `EASYAI_SKIP_FORCE_UPDATE=1` 环境变量跳过更新检查
122
- - `--help`、`--version` 命令自动跳过更新检查
115
+ - **跳过机制**:设置 `EASYAI_SKIP_FORCE_UPDATE=1` 环境变量或使用 `--help`、`--version` 命令时自动跳过
123
116
  - **更新命令**:`easyai update` 执行 `gem update easyai`
124
117
 
125
118
  ## 版本管理
126
119
 
127
- 版本在 `lib/easyai/version.rb` 中定义,自动被以下文件引用:
128
- - `easyai.gemspec` 通过 `require_relative 'lib/easyai/version'`
129
- - `lib/easyai/command.rb` 通过 `self.version = VERSION`
130
- - `lib/easyai.rb` 在启动标志中使用 `VERSION`
131
- - 发布脚本 (`test_local.sh`, `release_remote.sh`) 通过正则提取版本号
132
-
133
- 只需更新 `lib/easyai/version.rb` 中的 `VERSION` 常量 - 其他引用是自动的。
120
+ 版本在 `lib/easyai/version.rb` 中定义,只需更新 `VERSION` 常量即可。
134
121
 
135
122
  ### 发布流程
136
123
  `release_remote.sh` 脚本完成以下步骤:
137
- 1. 提交所有未提交的更改
124
+ 1. 提交所有未提交的更改(提交信息:`res 版本号`)
138
125
  2. 合并到 master 分支
139
126
  3. 构建和安装 gem
140
127
  4. 创建并推送 Git 标签(格式:v版本号)
141
128
  5. 发布到 RubyGems
142
129
 
143
- ## 依赖管理
144
-
145
- 项目依赖在 `easyai.gemspec` 中定义:
146
- - **运行时依赖**:
147
- - `claide ~> 1.0`:CLI 框架
148
- - `colored2 ~> 3.1`:终端颜色输出
149
- - `webrick ~> 1.9`:Web 服务器(用于版本检查,使用 1.9.1)
150
- - **开发依赖**:
151
- - `bundler ~> 2.0`:依赖管理
152
- - `rake ~> 13.0`:构建工具
153
- - `rspec ~> 3.0`:测试框架
154
- - **Ruby 版本要求**:>= 2.7.0
155
-
156
- ## 开发注意事项
157
-
158
- 1. **使用中文**:所有代码注释、提交信息、文档和交流都应使用中文
159
- 2. **用户界面中文化**:所有命令行帮助信息、提示信息、错误信息都必须使用中文
160
- 3. **测试流程**:使用 `./test_local.sh` 进行本地测试,确保功能正常后再发布
161
- 4. **跨平台兼容性**:添加新功能时要考虑 Windows、Linux、macOS 的兼容性
162
- 5. **环境隔离**:确保不影响用户的系统环境变量,所有配置都应在子进程中生效
163
- 6. **错误处理**:所有命令都应有完善的错误处理和用户友好的错误提示
164
- 7. **调试信息**:使用 `ENV['EASYAI_DEBUG']` 控制调试信息输出
165
-
166
- ## 中文化要求
167
-
168
- ### 代码界面中文化
169
- - **命令描述**:所有 `self.summary` 和 `self.description` 必须使用中文
170
- - **选项说明**:`self.options` 中的描述文字必须为中文
171
- - **错误信息**:`help!` 和错误提示必须使用中文
172
- - **交互提示**:用户输入提示(如 `print` 语句)必须使用中文
173
- - **状态信息**:运行时的状态输出必须使用中文
174
-
175
- ### 文档中文化
176
- - **README.md**:必须完全使用中文编写,包括所有章节标题、描述文字、使用示例
177
- - **代码注释**:所有代码注释必须使用中文
178
- - **提交信息**:Git 提交信息必须使用中文描述
179
- - **变更日志**:如有 CHANGELOG 文件,必须使用中文记录
180
- - **API 文档**:如有生成的 API 文档,描述内容应为中文
181
-
182
- ### 中文化检查清单
183
- 在添加新功能或修改现有功能时,确保:
184
- - [ ] 所有用户可见的文本都是中文
185
- - [ ] README.md 的新内容使用中文
186
- - [ ] 新的错误信息使用中文
187
- - [ ] 代码注释使用中文
188
- - [ ] 提交信息使用中文
189
-
190
- ## 命令帮助信息格式规范
191
-
192
- 所有命令的 `--help` 输出必须遵循统一格式,参考 pindo 工具的风格:
193
-
194
- ### 格式模板
195
- ```ruby
196
- self.summary = '简短的命令描述'
197
- self.description = <<-DESC
198
- 命令的简要说明。
199
-
200
- 主要功能:
201
-
202
- * 功能点1
203
-
204
- * 功能点2
205
-
206
- * 功能点3
207
-
208
- 使用示例:
209
-
210
- $ easyai command # 基本用法
130
+ ## CLAide 框架注意事项
211
131
 
212
- $ easyai command --option # 带选项用法
213
-
214
- $ easyai command arg1 arg2 # 带参数用法
215
-
216
- $ easyai command --opt=value # 带值的选项
217
- DESC
218
- ```
219
-
220
- ### 格式要求
221
- 1. **标题部分**:简洁明了的一句话说明
222
- 2. **功能列表**:使用星号(*)列出主要功能,每个功能独占一行
223
- 3. **示例部分**:使用美元符号($)开头,注释对齐以保持美观
224
- 4. **缩进规则**:
225
- - 主要段落顶格
226
- - 功能和示例缩进4个空格
227
- - 列表项之间空一行
228
-
229
- ## 技术实现注意事项
230
-
231
- ### 启动流程
232
- 1. **入口点**:`bin/easyai` 调用 `EasyAI::EasyAIApp.new.run(ARGV)`
233
- 2. **启动标志**:`EasyAIApp#show_banner` 显示版本信息(跳过 --help 和 --version)
234
- 3. **版本检查**:`EasyAIApp#check_version_before_run` 执行更新检查
235
- - 强制更新检查:`Base::VersionChecker.check_force_update!`
236
- - 同步检查:`Base::VersionChecker.check_sync`
237
- - 更新通知:`Base::UpdateNotifier.maybe_show_notification`
238
- 4. **命令执行**:`EasyAI::Command.run(argv)` 处理实际命令
239
-
240
- ### 输出格式规范
241
- 各命令使用统一的输出格式(参考 `lib/easyai/command/claude.rb`):
242
- - `print_status(icon_text, detail)`:状态信息,图标左对齐,详情用 cyan 色
243
- - `print_success(message)`:成功信息,绿色勾号
244
- - `print_warning(message)`:警告信息,黄色警告符
245
- - `print_error(message)`:错误信息,红色叉号
246
-
247
- ### CLAide 框架相关
248
-
249
- #### 1. --help 参数处理
250
- CLAide 框架对 --help 的处理机制:
251
- - 父类 Command 的 `initialize` 方法会调用 `argv.flag?('help')` 并设置 `@help_arg`
252
- - 子命令不应重复调用 `argv.flag?('help')`,而应使用父类的 `@help_arg` 属性
253
-
254
- 正确的实现方式:
255
- ```ruby
256
- def initialize(argv)
257
- super
258
- # 使用父类已经设置的 help_arg
259
- @args_help_flag = @help_arg
260
- end
261
-
262
- def validate!
263
- super
264
- help! if args_help_flag?
265
- end
266
- ```
267
-
268
- #### 2. argv.remainder! 调用时机
132
+ ### argv.remainder! 调用时机
269
133
  **重要**:`argv.remainder!` 必须在调用 `super` 之后执行。
270
134
 
271
- 错误示例:
272
- ```ruby
273
- def initialize(argv)
274
- @args = argv.remainder! # ❌ 错误:会清空 argv,导致父类无法获取 --help
275
- super
276
- end
277
- ```
278
-
279
135
  正确示例:
280
136
  ```ruby
281
137
  def initialize(argv)
@@ -284,20 +140,7 @@ def initialize(argv)
284
140
  end
285
141
  ```
286
142
 
287
- 原因说明:
288
- - `argv.remainder!` 会消耗并清空 argv 中的所有剩余参数
289
- - 如果在 `super` 之前调用,父类的 `initialize` 就无法获取 `--help` 等标志
290
- - 这会导致 `--help` 参数不能正确触发帮助信息,而是执行 `run` 方法
291
-
292
- #### 3. validate! 方法
293
- - 子命令的 `validate!` 中检查 CLI 工具是否可用
294
- - 父类的 `validate!` 会处理 help 标志
295
- - 如果检测到 help 标志,会调用 `help!` 抛出异常,阻止 `run` 方法执行
296
-
297
- #### 4. 抽象命令设置
298
- 使用 `abstract_command = true` 标记抽象命令:
299
- - `EasyAI::Command` 是抽象基类
300
- - `EasyAI::Command::Utils` 也是抽象命令,包含子命令 Encry 和 Decry
143
+ 原因:`argv.remainder!` 会消耗并清空 argv 中的所有剩余参数,如果在 `super` 之前调用,父类就无法获取 `--help` 等标志。
301
144
 
302
145
  ### 命令类继承结构
303
146
  ```
@@ -308,15 +151,39 @@ CLAide::Command
308
151
  ├── GPT
309
152
  ├── Clean
310
153
  ├── Update
154
+ ├── Setup
311
155
  └── Utils (abstract_command = true)
312
156
  ├── Encry
313
- └── Decry
157
+ ├── Decry
158
+ └── Export
314
159
  ```
315
160
 
316
- ### 添加新命令的标准流程
161
+ ## 添加新命令的标准流程
162
+
317
163
  1. 创建命令文件 `lib/easyai/command/newcmd.rb`
318
164
  2. 继承自 `EasyAI::Command`
319
- 3. 设置 `self.summary` 和 `self.description`(遵循格式规范)
165
+ 3. 设置 `self.summary` 和 `self.description`(使用中文)
320
166
  4. 实现 `initialize` 方法(注意 `super` 和 `argv.remainder!` 的顺序)
321
- 5. 实现 `run` 方法
322
- 6. `lib/easyai.rb` 中 require 新命令文件
167
+ 5. 实现 `validate!` 方法(可选,用于验证参数)
168
+ 6. 实现 `run` 方法(主要逻辑)
169
+ 7. 在 `lib/easyai.rb` 中 require 新命令文件
170
+
171
+ ### 输出格式规范
172
+ 各命令使用统一的输出格式:
173
+ - `print_status(icon_text, detail)`:状态信息,图标左对齐,详情用 cyan 色
174
+ - `print_success(message)`:成功信息,绿色勾号
175
+ - `print_warning(message)`:警告信息,黄色警告符
176
+ - `print_error(message)`:错误信息,红色叉号
177
+
178
+ ## 中文化要求
179
+
180
+ - **所有用户界面必须使用中文**:包括命令描述、选项说明、错误信息、交互提示、状态信息
181
+ - **所有文档必须使用中文**:README.md、代码注释、提交信息、API 文档
182
+
183
+ ## JPS 认证集成
184
+
185
+ 项目集成了 JPS 客户端认证系统(`lib/easyai/auth/jpsloginhelper.rb`):
186
+ - **统一认证接口**:兼容原 JPSLogin 的接口,提供 `login()` 和 `get_username()` 方法
187
+ - **配置文件管理**:通过 `EasyAIConfig` 自动获取 `jps_client_config.json` 配置文件路径
188
+ - **自动配置下载**:如果配置文件不存在,会自动触发配置仓库的下载和解密
189
+ - **用户名提取**:自动从认证令牌中提取用户名信息
data/easyai.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'claide', '~> 1.0'
22
22
  spec.add_dependency 'colored2', '~> 3.1'
23
23
  spec.add_dependency 'webrick', '~> 1.9'
24
+ spec.add_runtime_dependency 'jpsclient', '~> 1.0.0', '>= 1.0.0'
24
25
 
25
26
  spec.add_development_dependency 'bundler', '~> 2.0'
26
27
  spec.add_development_dependency 'rake', '~> 13.0'