easyai 2.0.0 → 2.2.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/CLAUDE.md +10 -0
- data/lib/easyai/base/toml_sections.rb +105 -0
- data/lib/easyai/command/ai_tool_base.rb +15 -5
- data/lib/easyai/command/backup/claude.rb +27 -11
- data/lib/easyai/command/backup/codex.rb +206 -0
- data/lib/easyai/command/backup.rb +3 -0
- data/lib/easyai/command/claude.rb +3 -0
- data/lib/easyai/command/clean.rb +3 -5
- data/lib/easyai/command/codex.rb +230 -0
- data/lib/easyai/command/restore/codex.rb +165 -0
- data/lib/easyai/command/restore.rb +3 -0
- data/lib/easyai/command/setup.rb +77 -56
- data/lib/easyai/config/local_config.rb +35 -6
- data/lib/easyai/version.rb +1 -1
- data/lib/easyai.rb +0 -1
- data//344/275/277/347/224/250/350/257/264/346/230/216.md +117 -0
- metadata +6 -3
- data/lib/easyai/command/gemini.rb +0 -38
|
@@ -62,13 +62,27 @@ module EasyAI
|
|
|
62
62
|
'deepseek' => 'DeepSeek',
|
|
63
63
|
'glm' => 'GLM(Coding Plan)',
|
|
64
64
|
'kimi' => 'Kimi',
|
|
65
|
-
'
|
|
65
|
+
'longcat' => 'LongCat(美团)',
|
|
66
|
+
'minimax' => 'MiniMax',
|
|
67
|
+
'openai_official' => 'ChatGPT Subscribe'
|
|
66
68
|
}.freeze
|
|
67
69
|
|
|
68
70
|
def platform_display_name(key)
|
|
69
71
|
PLATFORM_DISPLAY_NAMES.fetch(key, key)
|
|
70
72
|
end
|
|
71
73
|
|
|
74
|
+
# 已屏蔽的平台:保留模板与 config 数据,仅暂不对外提供(setup 不列出、runtime 不可选)。
|
|
75
|
+
# codex/deepseek:新版 codex 移除了 wire_api="chat",而 DeepSeek 暂无 Responses API
|
|
76
|
+
# (/responses 实测 404),接入即失败,故先屏蔽。待 DeepSeek 支持 Responses 或接入协议
|
|
77
|
+
# 转换代理后,从本表删除该项即可恢复(profile 模板与 KNOWN_PLATFORMS 条目均未删除)。
|
|
78
|
+
DISABLED_PLATFORMS = {
|
|
79
|
+
'codex' => %w[deepseek]
|
|
80
|
+
}.freeze
|
|
81
|
+
|
|
82
|
+
def disabled_platform?(tool, platform)
|
|
83
|
+
Array(DISABLED_PLATFORMS[tool]).include?(platform)
|
|
84
|
+
end
|
|
85
|
+
|
|
72
86
|
def available_platforms(tool)
|
|
73
87
|
return [] unless exists?
|
|
74
88
|
|
|
@@ -81,16 +95,31 @@ module EasyAI
|
|
|
81
95
|
|
|
82
96
|
# 解析平台配置。选定平台后会 yield 平台名(如果给了 block),
|
|
83
97
|
# 让上层(AIToolBase)负责打印 UI 提示,保持 LocalConfig 的输出最小化。
|
|
84
|
-
|
|
98
|
+
# extra:调用方注入的虚拟平台 { key => data }(如 codex 的 ChatGPT Subscribe),
|
|
99
|
+
# 与 config.json 中真实平台合并参与选择;选中虚拟平台时返回其 data。
|
|
100
|
+
def resolve_platform(tool:, platform: nil, verbose: false, extra: {})
|
|
85
101
|
cfg = load
|
|
86
102
|
tool_cfg = cfg[tool]
|
|
87
103
|
platforms = tool_cfg.is_a?(Hash) ? tool_cfg['platforms'] : nil
|
|
88
|
-
|
|
104
|
+
platforms = {} unless platforms.is_a?(Hash)
|
|
105
|
+
extra = {} unless extra.is_a?(Hash)
|
|
106
|
+
|
|
107
|
+
# 显式指定了已屏蔽平台:直接拒绝(extra 虚拟平台不受屏蔽影响)
|
|
108
|
+
if platform && !platform.empty? && disabled_platform?(tool, platform) && !extra.key?(platform)
|
|
109
|
+
raise PlatformNotFoundError, "工具 #{tool} 的平台 #{platform} 已被屏蔽(暂不可用)"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# 屏蔽清单中的真实平台不参与选择(保留 config 数据,仅隐藏)
|
|
113
|
+
visible = platforms.reject { |name, _| disabled_platform?(tool, name) }
|
|
114
|
+
# 数据层:extra(虚拟平台,如 ChatGPT Subscribe)覆盖同名真实平台,保留其 marker
|
|
115
|
+
merged = visible.merge(extra)
|
|
116
|
+
if merged.empty?
|
|
89
117
|
raise ToolNotConfiguredError,
|
|
90
118
|
"工具 #{tool} 未配置任何平台,请运行 easyai setup --tool=#{tool}"
|
|
91
119
|
end
|
|
92
120
|
|
|
93
|
-
|
|
121
|
+
# 顺序层:extra 虚拟平台始终排在选择列表最前(如【ChatGPT Subscribe】恒为第一项)
|
|
122
|
+
available = extra.keys + (visible.keys - extra.keys)
|
|
94
123
|
selected =
|
|
95
124
|
if platform && !platform.empty?
|
|
96
125
|
unless available.include?(platform)
|
|
@@ -107,8 +136,8 @@ module EasyAI
|
|
|
107
136
|
interactive_select(tool, available)
|
|
108
137
|
end
|
|
109
138
|
|
|
110
|
-
yield(platform_display_name(selected)) if block_given?
|
|
111
|
-
|
|
139
|
+
yield(platform_display_name(selected), selected) if block_given?
|
|
140
|
+
merged[selected]
|
|
112
141
|
end
|
|
113
142
|
|
|
114
143
|
def upsert_platform(tool, platform, data)
|
data/lib/easyai/version.rb
CHANGED
data/lib/easyai.rb
CHANGED
|
@@ -3,7 +3,6 @@ require 'easyai/config/local_config'
|
|
|
3
3
|
require 'easyai/command'
|
|
4
4
|
require 'easyai/command/ai_tool_base'
|
|
5
5
|
require 'easyai/command/claude'
|
|
6
|
-
require 'easyai/command/gemini'
|
|
7
6
|
require 'easyai/command/codex'
|
|
8
7
|
require 'easyai/command/utils'
|
|
9
8
|
require 'easyai/command/clean'
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# EasyAI 使用说明
|
|
2
|
+
|
|
3
|
+
一个命令,统一启动 **Claude / Codex** 等 AI 命令行工具。
|
|
4
|
+
|
|
5
|
+
凭证、代理、多平台切换都放在一个本地配置文件里;启动时只把环境变量注入子进程,**不污染你的终端**。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
gem install easyai # 需要 Ruby >= 3.0
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
AI CLI 本身需自行安装(EasyAI 只负责帮你启动它们):
|
|
16
|
+
|
|
17
|
+
| 工具 | 安装命令 |
|
|
18
|
+
|------|----------|
|
|
19
|
+
| Claude | `npm install -g @anthropic-ai/claude-code` |
|
|
20
|
+
| Codex | 参考 OpenAI Codex 官方文档 |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. 备份已有登录(建议先做)
|
|
25
|
+
|
|
26
|
+
如果你**已经登录过** Claude Code 或 Codex,配置前先把登录态备份下来,方便日后换机恢复:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
easyai backup claude # 备份 Claude Code 登录信息
|
|
30
|
+
easyai backup codex # 备份 Codex(ChatGPT 订阅)登录信息
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**分别备份哪些信息:**
|
|
34
|
+
|
|
35
|
+
| 命令 | 来源 | 备份内容 |
|
|
36
|
+
|------|------|----------|
|
|
37
|
+
| `backup claude` | `~/.claude.json` | 账号/登录配置(**排除** `projects` 会话历史);macOS 上额外读取钥匙串「Claude Code-credentials」里的 OAuth token |
|
|
38
|
+
| `backup codex` | `~/.codex/auth.json` + `config.toml` | ChatGPT 登录凭证(OAuth token)与全局配置(**排除** `[projects.*]` 本地授信段)|
|
|
39
|
+
|
|
40
|
+
备份统一写入 `~/.easyai/backup/`(`.claude.json` / `.codex.json`,自动 `chmod 600`),
|
|
41
|
+
**只保留凭证与必要配置,不含会话历史、项目授信等大数据**。没登录过可跳过这一步。
|
|
42
|
+
|
|
43
|
+
> `backup codex` 仅在检测到 ChatGPT 官方登录(OAuth)时才备份;纯第三方 API Key 不在此列。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 3. 首次配置
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
easyai setup
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
跟着交互提示走:选择工具 → 选择平台 → 填入 API Key 即可。
|
|
54
|
+
|
|
55
|
+
> 输入 Key 时不回显是正常的,粘贴后直接回车。
|
|
56
|
+
|
|
57
|
+
配置保存在 `~/.easyai/config.json`,文件权限自动设为私有(`600`)。
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. 启动使用
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
easyai claude # 配了多个平台时会让你选
|
|
65
|
+
easyai claude --platform=kimi # 直接指定平台
|
|
66
|
+
easyai codex
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
启动前会打印当前生效的平台和环境变量(Key 已脱敏),确认无误即进入 AI CLI。
|
|
70
|
+
|
|
71
|
+
传给 AI CLI 的参数照常写在后面,会原样透传:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
easyai claude --help # --help 会传给 claude
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 5. 常用配置管理
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
easyai setup --list # 查看当前配置(Key 脱敏)
|
|
83
|
+
easyai setup --add=kimi --tool=claude # 追加/覆盖一个平台
|
|
84
|
+
easyai setup --remove=kimi --tool=claude # 删除一个平台
|
|
85
|
+
easyai setup --edit # 用编辑器直接改配置
|
|
86
|
+
easyai setup --reset # 清空重来
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 6. 其他命令
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
easyai clean # 清理 claude 缓存
|
|
95
|
+
easyai clean all # 清理所有 AI CLI 缓存(不动你的配置)
|
|
96
|
+
easyai clean all --dry-run # 先预览要删什么
|
|
97
|
+
|
|
98
|
+
easyai update # 升级 EasyAI 自身
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 常见问题
|
|
104
|
+
|
|
105
|
+
**Q:换一台电脑怎么迁移?**
|
|
106
|
+
把整个 `~/.easyai/` 目录拷过去即可——`config.json` 是平台配置,`backup/` 是各 AI CLI 的登录态。
|
|
107
|
+
(内含明文 Key 与登录凭证,注意别外传。)
|
|
108
|
+
|
|
109
|
+
**Q:网络不通导致启动被版本检查卡住?**
|
|
110
|
+
临时加环境变量跳过:`EASYAI_SKIP_FORCE_UPDATE=1 easyai claude`
|
|
111
|
+
|
|
112
|
+
**Q:想看详细日志?**
|
|
113
|
+
`easyai claude --verbose` 或 `EASYAI_DEBUG=1 easyai claude`
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
有问题随时反馈,祝使用愉快 🎉
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: easyai
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Wade
|
|
@@ -114,18 +114,20 @@ files:
|
|
|
114
114
|
- lib/easyai/base/file_crypto.rb
|
|
115
115
|
- lib/easyai/base/secret_masker.rb
|
|
116
116
|
- lib/easyai/base/system_info.rb
|
|
117
|
+
- lib/easyai/base/toml_sections.rb
|
|
117
118
|
- lib/easyai/base/update_notifier.rb
|
|
118
119
|
- lib/easyai/base/version_checker.rb
|
|
119
120
|
- lib/easyai/command.rb
|
|
120
121
|
- lib/easyai/command/ai_tool_base.rb
|
|
121
122
|
- lib/easyai/command/backup.rb
|
|
122
123
|
- lib/easyai/command/backup/claude.rb
|
|
124
|
+
- lib/easyai/command/backup/codex.rb
|
|
123
125
|
- lib/easyai/command/claude.rb
|
|
124
126
|
- lib/easyai/command/clean.rb
|
|
125
127
|
- lib/easyai/command/codex.rb
|
|
126
|
-
- lib/easyai/command/gemini.rb
|
|
127
128
|
- lib/easyai/command/restore.rb
|
|
128
129
|
- lib/easyai/command/restore/claude.rb
|
|
130
|
+
- lib/easyai/command/restore/codex.rb
|
|
129
131
|
- lib/easyai/command/setup.rb
|
|
130
132
|
- lib/easyai/command/update.rb
|
|
131
133
|
- lib/easyai/command/utils.rb
|
|
@@ -133,6 +135,7 @@ files:
|
|
|
133
135
|
- lib/easyai/command/utils/encry.rb
|
|
134
136
|
- lib/easyai/config/local_config.rb
|
|
135
137
|
- lib/easyai/version.rb
|
|
138
|
+
- 使用说明.md
|
|
136
139
|
homepage: https://github.com/wade/easyai
|
|
137
140
|
licenses:
|
|
138
141
|
- MIT
|
|
@@ -151,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
151
154
|
- !ruby/object:Gem::Version
|
|
152
155
|
version: '0'
|
|
153
156
|
requirements: []
|
|
154
|
-
rubygems_version:
|
|
157
|
+
rubygems_version: 4.0.11
|
|
155
158
|
specification_version: 4
|
|
156
159
|
summary: Claude / Gemini / Codex 三家 AI CLI 的本地化统一入口
|
|
157
160
|
test_files: []
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'ai_tool_base'
|
|
4
|
-
|
|
5
|
-
module EasyAI
|
|
6
|
-
class Command
|
|
7
|
-
class Gemini < AIToolBase
|
|
8
|
-
self.summary = '启动 Gemini 命令行(多平台支持)'
|
|
9
|
-
self.description = <<-DESC
|
|
10
|
-
启动 Google Gemini CLI,从 ~/.easyai/config.json 读取平台配置,并将凭证 / 代理仅注入子进程。
|
|
11
|
-
|
|
12
|
-
使用示例:
|
|
13
|
-
|
|
14
|
-
$ easyai gemini # 多平台时进入交互选择
|
|
15
|
-
$ easyai gemini --platform=google_official
|
|
16
|
-
$ easyai gemini ./adhoc.json # 用一次性 JSON 覆盖(单平台扁平 schema)
|
|
17
|
-
$ easyai gemini -- --help # 透传参数给 gemini CLI
|
|
18
|
-
DESC
|
|
19
|
-
|
|
20
|
-
self.arguments = [
|
|
21
|
-
CLAide::Argument.new('CONFIG.json', false),
|
|
22
|
-
CLAide::Argument.new('ARGS', false, true)
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
def tool_name
|
|
26
|
-
'gemini'
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def exec_command
|
|
30
|
-
'gemini'
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def install_hint
|
|
34
|
-
'未找到 gemini CLI。请安装:npm install -g @google/gemini-cli'
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|