easyai 1.0.2 → 1.0.4
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/CLAUDE.md +154 -5
- data/README.md +38 -57
- data/bin/easyai +5 -5
- data/easyai.gemspec +1 -0
- data/lib/easyai/auth/authclaude.rb +440 -0
- data/lib/easyai/auth/jpslogin.rb +384 -0
- data/lib/easyai/base/file_crypto.rb +214 -0
- data/lib/easyai/base/system_keychain.rb +240 -0
- data/lib/easyai/base/update_notifier.rb +129 -0
- data/lib/easyai/base/version_checker.rb +329 -0
- data/lib/easyai/command/claude.rb +278 -0
- data/lib/easyai/command/clean.rb +453 -0
- data/lib/easyai/command/gemini.rb +58 -0
- data/lib/easyai/command/gpt.rb +58 -0
- data/lib/easyai/command/update.rb +210 -0
- data/lib/easyai/command/utils/decry.rb +102 -0
- data/lib/easyai/command/utils/encry.rb +102 -0
- data/lib/easyai/command/utils.rb +32 -0
- data/lib/easyai/command.rb +56 -0
- data/lib/easyai/config/config.rb +550 -0
- data/lib/easyai/version.rb +1 -1
- data/lib/easyai.rb +67 -55
- metadata +31 -4
- data/lib/easyai/claude.rb +0 -61
- data/lib/easyai/gemini.rb +0 -61
- data/lib/easyai/gpt.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7511936104d9115b56bf3ec36425dcdffeedc7cf1c600463901242a281b7505
|
4
|
+
data.tar.gz: 3f656f1f9da2e0a5ff242707865f960077f5b4b6937b4d5de1fd6db41df03f4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05d9c00dfa0732c8379441e29006722e4a9354b255ca6c1209f87b22b586052333fde54edab402406d19883b34f93a36567cf8dd8df4cd08e6b326dd8490323c
|
7
|
+
data.tar.gz: 9648b22cfbbee85132f78dd034d29ca5340af3051f7465bd95d150de942983148fffe4abf43b691cebe0a5cf5eadc8447e0908235825c2618c80107ff5d21881
|
data/CLAUDE.md
CHANGED
@@ -6,14 +6,16 @@ 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
11
|
## 架构设计
|
12
12
|
|
13
13
|
代码库采用基于 CLAide 的模块化架构:
|
14
14
|
|
15
15
|
- **主命令 (`lib/easyai.rb`)**:抽象基础命令,处理全局选项(`--setup`、`--config`)和配置管理
|
16
|
-
-
|
16
|
+
- **AI 工具子命令 (`lib/easyai/command/*.rb`)**:每个 AI 工具(claude、gemini、gpt)都有自己的命令类,继承自主命令
|
17
|
+
- **工具命令 (`lib/easyai/command/utils/`)**:实用工具集合,包括文件加密解密功能
|
18
|
+
- **基础模块 (`lib/easyai/base/`)**:核心功能模块,如文件加密 (`file_crypto.rb`) 和系统钥匙串 (`system_keychain.rb`)
|
17
19
|
- **环境隔离**:使用 Ruby 的 `exec()` 替换当前进程为目标 AI 工具,在注入环境变量的同时保持交互性
|
18
20
|
- **跨平台支持**:处理 Unix(`which`)和 Windows(`where`)之间的命令检测差异
|
19
21
|
|
@@ -22,7 +24,7 @@ EasyAI 是一个 Ruby CLI 工具,作为 AI 命令行工具(Claude、Gemini
|
|
22
24
|
### 开发和测试
|
23
25
|
```bash
|
24
26
|
# 本地开发测试
|
25
|
-
./test_local.sh # 本地构建和安装 gem
|
27
|
+
./test_local.sh # 本地构建和安装 gem(自动检测版本和项目名称)
|
26
28
|
ruby bin/easyai --help # 开发期间测试
|
27
29
|
|
28
30
|
# 发布流程
|
@@ -31,6 +33,10 @@ ruby bin/easyai --help # 开发期间测试
|
|
31
33
|
# 手动 gem 操作
|
32
34
|
gem build easyai.gemspec # 构建 gem 包
|
33
35
|
gem install easyai-x.x.x.gem # 安装特定版本
|
36
|
+
|
37
|
+
# 测试加密解密功能
|
38
|
+
EASYAI_TEST_PASSWORD=testdir123 easyai utils encry /tmp/test_dir
|
39
|
+
EASYAI_TEST_PASSWORD=testdir123 easyai utils decry /tmp/test_dir_encrypted
|
34
40
|
```
|
35
41
|
|
36
42
|
### 配置管理
|
@@ -44,11 +50,21 @@ easyai --config
|
|
44
50
|
# 配置文件:~/.easyai/config.yml
|
45
51
|
```
|
46
52
|
|
53
|
+
### 工具命令
|
54
|
+
```bash
|
55
|
+
# 文件加密解密
|
56
|
+
easyai utils encry <文件/目录路径> [输出路径] # 加密文件或目录
|
57
|
+
easyai utils decry <文件/目录路径> [输出路径] # 解密文件或目录
|
58
|
+
|
59
|
+
# 清理功能
|
60
|
+
easyai clean # 清理临时文件和缓存
|
61
|
+
```
|
62
|
+
|
47
63
|
## 核心实现细节
|
48
64
|
|
49
65
|
### 环境变量注入
|
50
66
|
每个子命令在调用 `exec()` 前合并环境变量:
|
51
|
-
- Claude: `
|
67
|
+
- Claude: `CLAUDE_CODE_OAUTH_TOKEN`
|
52
68
|
- Gemini: `GOOGLE_API_KEY`, `GEMINI_API_KEY`
|
53
69
|
- OpenAI: `OPENAI_API_KEY`
|
54
70
|
- 代理: `HTTP_PROXY`, `HTTPS_PROXY`, `http_proxy`, `https_proxy`
|
@@ -65,6 +81,14 @@ easyai --config
|
|
65
81
|
- 透明处理 Ctrl+C 和其他信号
|
66
82
|
- 保持与直接运行工具相同的用户体验
|
67
83
|
|
84
|
+
### 文件加密系统
|
85
|
+
基于 AES-128-ECB 的文件加密功能 (`lib/easyai/base/file_crypto.rb`):
|
86
|
+
- **单文件加密**:支持任意文件类型,输出 `.encrypted` 文件
|
87
|
+
- **目录批量加密**:递归加密目录中所有文件,保持原有目录结构
|
88
|
+
- **智能解密**:自动识别 `.encrypted` 文件并恢复原文件名
|
89
|
+
- **密码管理**:支持交互式密码输入和环境变量密码(`EASYAI_TEST_PASSWORD`)
|
90
|
+
- **错误处理**:完整的错误处理和用户友好提示
|
91
|
+
|
68
92
|
## 版本管理
|
69
93
|
|
70
94
|
版本在 `lib/easyai/version.rb` 中定义,自动被以下文件引用:
|
@@ -74,6 +98,18 @@ easyai --config
|
|
74
98
|
|
75
99
|
只需更新 `lib/easyai/version.rb` 中的版本 - 其他引用是自动的。
|
76
100
|
|
101
|
+
## 依赖管理
|
102
|
+
|
103
|
+
项目依赖在 `easyai.gemspec` 中定义:
|
104
|
+
- **运行时依赖**:
|
105
|
+
- `claide ~> 1.0`:CLI 框架
|
106
|
+
- `colored2 ~> 3.1`:终端颜色输出
|
107
|
+
- **开发依赖**:
|
108
|
+
- `bundler ~> 2.0`:依赖管理
|
109
|
+
- `rake ~> 13.0`:构建工具
|
110
|
+
- `rspec ~> 3.0`:测试框架
|
111
|
+
- **Ruby 版本要求**:>= 2.7.0
|
112
|
+
|
77
113
|
## 开发注意事项
|
78
114
|
|
79
115
|
1. **使用中文**:所有代码注释、提交信息、文档和交流都应使用中文
|
@@ -104,4 +140,117 @@ easyai --config
|
|
104
140
|
- [ ] README.md 的新内容使用中文
|
105
141
|
- [ ] 新的错误信息使用中文
|
106
142
|
- [ ] 代码注释使用中文
|
107
|
-
- [ ] 提交信息使用中文
|
143
|
+
- [ ] 提交信息使用中文
|
144
|
+
|
145
|
+
## 命令帮助信息格式规范
|
146
|
+
|
147
|
+
所有命令的 `--help` 输出必须遵循统一格式,参考 pindo 工具的风格:
|
148
|
+
|
149
|
+
### 格式模板
|
150
|
+
```ruby
|
151
|
+
self.summary = '简短的命令描述'
|
152
|
+
self.description = <<-DESC
|
153
|
+
命令的简要说明。
|
154
|
+
|
155
|
+
主要功能:
|
156
|
+
|
157
|
+
* 功能点1
|
158
|
+
|
159
|
+
* 功能点2
|
160
|
+
|
161
|
+
* 功能点3
|
162
|
+
|
163
|
+
使用示例:
|
164
|
+
|
165
|
+
$ easyai command # 基本用法
|
166
|
+
|
167
|
+
$ easyai command --option # 带选项用法
|
168
|
+
|
169
|
+
$ easyai command arg1 arg2 # 带参数用法
|
170
|
+
|
171
|
+
$ easyai command --opt=value # 带值的选项
|
172
|
+
DESC
|
173
|
+
```
|
174
|
+
|
175
|
+
### 格式要求
|
176
|
+
1. **标题部分**:简洁明了的一句话说明
|
177
|
+
2. **功能列表**:使用星号(*)列出主要功能,每个功能独占一行
|
178
|
+
3. **示例部分**:使用美元符号($)开头,注释对齐以保持美观
|
179
|
+
4. **缩进规则**:
|
180
|
+
- 主要段落顶格
|
181
|
+
- 功能和示例缩进4个空格
|
182
|
+
- 列表项之间空一行
|
183
|
+
|
184
|
+
## 技术实现注意事项
|
185
|
+
|
186
|
+
### CLAide 框架相关
|
187
|
+
|
188
|
+
#### 1. --help 参数处理
|
189
|
+
CLAide 框架对 --help 的处理机制:
|
190
|
+
- 父类 Command 的 `initialize` 方法会调用 `argv.flag?('help')` 并设置 `@help_arg`
|
191
|
+
- 子命令不应重复调用 `argv.flag?('help')`,而应使用父类的 `@help_arg` 属性
|
192
|
+
|
193
|
+
正确的实现方式:
|
194
|
+
```ruby
|
195
|
+
def initialize(argv)
|
196
|
+
super
|
197
|
+
# 使用父类已经设置的 help_arg
|
198
|
+
@args_help_flag = @help_arg
|
199
|
+
end
|
200
|
+
|
201
|
+
def validate!
|
202
|
+
super
|
203
|
+
help! if args_help_flag?
|
204
|
+
end
|
205
|
+
```
|
206
|
+
|
207
|
+
#### 2. argv.remainder! 调用时机
|
208
|
+
**重要**:`argv.remainder!` 必须在调用 `super` 之后执行。
|
209
|
+
|
210
|
+
错误示例:
|
211
|
+
```ruby
|
212
|
+
def initialize(argv)
|
213
|
+
@args = argv.remainder! # ❌ 错误:会清空 argv,导致父类无法获取 --help
|
214
|
+
super
|
215
|
+
end
|
216
|
+
```
|
217
|
+
|
218
|
+
正确示例:
|
219
|
+
```ruby
|
220
|
+
def initialize(argv)
|
221
|
+
super
|
222
|
+
@args = @argv.remainder! # ✅ 正确:super 之后调用,使用 @argv
|
223
|
+
end
|
224
|
+
```
|
225
|
+
|
226
|
+
原因说明:
|
227
|
+
- `argv.remainder!` 会消耗并清空 argv 中的所有剩余参数
|
228
|
+
- 如果在 `super` 之前调用,父类的 `initialize` 就无法获取 `--help` 等标志
|
229
|
+
- 这会导致 `--help` 参数不能正确触发帮助信息,而是执行 `run` 方法
|
230
|
+
|
231
|
+
#### 3. validate! 方法
|
232
|
+
- 子命令的 `validate!` 中检查 CLI 工具是否可用
|
233
|
+
- 父类的 `validate!` 会处理 help 标志
|
234
|
+
- 如果检测到 help 标志,会调用 `help!` 抛出异常,阻止 `run` 方法执行
|
235
|
+
|
236
|
+
### 命令类继承结构
|
237
|
+
```
|
238
|
+
CLAide::Command
|
239
|
+
└── EasyAI::Command (abstract_command = true)
|
240
|
+
├── Claude
|
241
|
+
├── Gemini
|
242
|
+
├── GPT
|
243
|
+
├── Clean
|
244
|
+
├── Update
|
245
|
+
└── Utils (abstract_command = true)
|
246
|
+
├── Encry
|
247
|
+
└── Decry
|
248
|
+
```
|
249
|
+
|
250
|
+
### 添加新命令的标准流程
|
251
|
+
1. 创建命令文件 `lib/easyai/command/newcmd.rb`
|
252
|
+
2. 继承自 `EasyAI::Command`
|
253
|
+
3. 设置 `self.summary` 和 `self.description`(遵循格式规范)
|
254
|
+
4. 实现 `initialize` 方法(注意 `super` 和 `argv.remainder!` 的顺序)
|
255
|
+
5. 实现 `run` 方法
|
256
|
+
6. 在 `lib/easyai.rb` 中 require 新命令文件
|
data/README.md
CHANGED
@@ -1,94 +1,75 @@
|
|
1
1
|
# EasyAI
|
2
2
|
|
3
|
-
|
3
|
+
简化 AI 命令行工具使用的 Ruby 包装器,支持 Claude、Gemini 和 OpenAI。
|
4
4
|
|
5
5
|
## 安装
|
6
6
|
|
7
7
|
```bash
|
8
|
-
gem
|
9
|
-
gem install easyai-1.0.2.gem
|
8
|
+
gem install easyai
|
10
9
|
```
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
首先配置你的 API 令牌:
|
15
|
-
|
11
|
+
或从源码安装:
|
16
12
|
```bash
|
17
|
-
easyai
|
13
|
+
gem build easyai.gemspec
|
14
|
+
gem install easyai-*.gem
|
18
15
|
```
|
19
16
|
|
20
|
-
|
21
|
-
- Claude API 令牌
|
22
|
-
- Gemini API 令牌
|
23
|
-
- OpenAI API 令牌
|
24
|
-
- HTTP 代理(可选)
|
25
|
-
|
26
|
-
配置会保存到 `~/.easyai/config.yml`
|
27
|
-
|
28
|
-
## 使用方法
|
17
|
+
## 快速开始
|
29
18
|
|
30
19
|
### Claude
|
31
20
|
```bash
|
32
|
-
#
|
33
|
-
easyai claude
|
34
|
-
|
35
|
-
# 单次查询
|
36
|
-
easyai claude --print "解释这段代码"
|
37
|
-
|
38
|
-
# 继续对话
|
39
|
-
easyai claude --continue
|
40
|
-
|
41
|
-
# 选择模型
|
42
|
-
easyai claude --model sonnet "分析性能"
|
21
|
+
easyai claude # 启动 Claude CLI
|
22
|
+
easyai claude ./config.json # 使用本地配置文件
|
43
23
|
```
|
44
24
|
|
45
25
|
### Gemini
|
46
26
|
```bash
|
47
|
-
#
|
48
|
-
easyai gemini
|
49
|
-
|
50
|
-
# 调试模式
|
51
|
-
easyai gemini --debug "优化这个函数"
|
52
|
-
|
53
|
-
# YOLO 模式
|
54
|
-
easyai gemini --yolo
|
27
|
+
easyai gemini # 启动 Gemini CLI
|
28
|
+
easyai gemini chat # 开始聊天会话
|
55
29
|
```
|
56
30
|
|
57
|
-
### GPT
|
31
|
+
### OpenAI GPT
|
58
32
|
```bash
|
59
|
-
#
|
60
|
-
easyai gpt
|
61
|
-
|
62
|
-
# 单次查询
|
63
|
-
easyai gpt "写一个函数"
|
33
|
+
easyai gpt # 启动 OpenAI CLI
|
34
|
+
easyai gpt api chat.completions # 调用 API
|
64
35
|
```
|
65
36
|
|
66
|
-
##
|
37
|
+
## 实用工具
|
38
|
+
|
39
|
+
### 文件加密解密
|
40
|
+
```bash
|
41
|
+
easyai utils encry file.txt # 加密文件
|
42
|
+
easyai utils decry file.encrypted # 解密文件
|
43
|
+
```
|
67
44
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
- ✅ 交互式配置设置
|
74
|
-
- ✅ 跨平台支持(Windows、Linux、macOS)
|
45
|
+
### 配置清理
|
46
|
+
```bash
|
47
|
+
easyai clean # 清理 Claude 配置
|
48
|
+
easyai clean all # 清理所有配置
|
49
|
+
```
|
75
50
|
|
76
51
|
## 系统要求
|
77
52
|
|
78
53
|
- Ruby >= 2.7.0
|
79
|
-
-
|
54
|
+
- 对应的 AI CLI 工具:
|
80
55
|
- Claude: `npm install -g @anthropic-ai/claude-code`
|
81
56
|
- Gemini: `npm install -g @google/gemini-cli`
|
82
57
|
- OpenAI: `pip install openai`
|
83
58
|
|
59
|
+
## 特性
|
60
|
+
|
61
|
+
- 🔐 环境隔离,不影响系统配置
|
62
|
+
- 🌐 支持远程配置自动下载
|
63
|
+
- 🔄 透传所有参数到原生 CLI
|
64
|
+
- 🛠 包含实用工具集
|
65
|
+
|
84
66
|
## 开发
|
85
67
|
|
86
|
-
### 本地测试
|
87
68
|
```bash
|
88
|
-
./test_local.sh
|
69
|
+
./test_local.sh # 本地测试
|
70
|
+
./release_remote.sh # 发布到 RubyGems
|
89
71
|
```
|
90
72
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
```
|
73
|
+
## License
|
74
|
+
|
75
|
+
MIT
|
data/bin/easyai
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
$LOAD_PATH.unshift(lib_path) unless $LOAD_PATH.include?(lib_path)
|
3
|
+
# 设置lib路径
|
4
|
+
lib = File.expand_path('../../lib', __FILE__)
|
5
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
7
6
|
|
8
7
|
require 'easyai'
|
9
8
|
|
10
|
-
EasyAI
|
9
|
+
# 创建并运行 EasyAI 应用
|
10
|
+
EasyAI::EasyAIApp.new.run(ARGV)
|
data/easyai.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'claide', '~> 1.0'
|
22
22
|
spec.add_dependency 'colored2', '~> 3.1'
|
23
|
+
spec.add_dependency 'webrick', '~> 1.7'
|
23
24
|
|
24
25
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
25
26
|
spec.add_development_dependency 'rake', '~> 13.0'
|