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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb64eed44834624ee484d3db907ff850bf76280a0a19f56370902a3e3832ddfc
4
- data.tar.gz: e173b56ebc2e370631d245a1584ae01155652949bdc8659385683852286399bc
3
+ metadata.gz: e0e9e5abc64041d1ca3e0a9fb59a81aa3dcdd16edfdfa716069fa17a71df1f4b
4
+ data.tar.gz: b729e5453a287e1e7fb6908fba42bd4516e48800eafff811d4b0fea80bb83653
5
5
  SHA512:
6
- metadata.gz: 9b050e5b6dc822af6886cfa9af53871f1027427e51bd509380c0f9842a0a70d16a9d4ce37d60479d20f61d3687fdb59d7a6505f225d4bf0b401ec01f5cf5ad37
7
- data.tar.gz: 65a30d6e73f865564b8c1dfe8e7483ecdee4ac2d84e9b3af6f48116ad1144d09b0aafeed21c58e6dd766ffea632f8eb8b0d9884baedda0d29d9c04530184bfcd
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`,命令定义在 `lib/easyai/command` 及其子目录(如 `claude.rb`、`gemini.rb`)。
5
- - 配置读取逻辑保存在 `lib/easyai/config`,认证与第三方服务脚本位于 `lib/easyai/auth`; 版本号定义于 `lib/easyai/version.rb` 并由 `easyai.gemspec` 消费。
6
- - CLI 启动脚本是 `bin/easyai`;打包产物默认输出在项目根目录。辅助脚本 `test_local.sh` `release_remote.sh` 承担本地测试与正式发布,请保留可执行权限并在修改后记录变更。
7
- - 未来添加测试文件时,统一放在 `spec/` 目录,可按模块建立 `spec/command`、`spec/base` 等子目录,以便快速定位;示例数据建议放入 `spec/support/fixtures`。
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
- - `./test_local.sh`:自动执行打包并安装到本地 Ruby 环境,适合冒烟回归;`./release_remote.sh` 覆盖提交流程、分支同步和 `gem push`,仅在确认要发布时运行,并保证当前分支已同步远程。
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
- - 使用 RSpec 进行行为驱动测试,文件命名为 `<feature>_spec.rb`;`describe` 中强调用户视角,例如 CLI 参数解析或远程更新提示。
28
- - 对加密、配置清理等高风险逻辑,建立 fixture(建议放在 `spec/support/fixtures`)并测试成功与失败路径;必要时模拟外部命令退出码。
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
- - 提交前至少运行一次 `bundle exec rspec`;若修改了打包或权限脚本,请额外执行 `./test_local.sh` 验证安装流程,并记录输出结果。
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 工具,作为 AI 命令行工具(Claude、Gemini、GPT)的包装器。它提供环境隔离和配置管理功能,允许用户使用预配置的 API 令牌和代理设置运行 AI 工具,而不会影响系统环境变量。项目还包含实用工具集合,如文件加密解密和配置导出功能。
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
- ./test_local.sh # 本地构建和安装 gem(自动检测版本和项目名称)
17
- ruby bin/easyai --help # 开发期间测试
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
- # 手动 gem 操作
23
- gem build easyai.gemspec # 构建 gem 包
24
- gem install easyai-x.x.x.gem # 安装特定版本
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 --config
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
- # 配置文件位置:~/.easyai/config.yml
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 # 清理 Claude 配置缓存
58
- easyai clean all # 清理所有配置(Claude、Gemini、GPT)
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
- 代码库采用基于 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 工具,在注入环境变量的同时保持交互性
82
-
83
- ### 环境变量注入
84
- 每个子命令在调用 `exec()` 前合并环境变量:
85
- - Claude: `CLAUDE_CODE_OAUTH_TOKEN`
86
- - Gemini: `GOOGLE_API_KEY`, `GEMINI_API_KEY`
87
- - OpenAI: `OPENAI_API_KEY`
88
- - 代理: `HTTP_PROXY`, `HTTPS_PROXY`, `http_proxy`, `https_proxy`
89
-
90
- ### 认证优先级机制
91
- AI 工具的认证令牌获取优先级:
92
- 1. **远程配置**:首先尝试通过 `EasyAIConfig` 下载并解密远程配置文件
93
- 2. **本地配置**:如果指定了本地 JSON 配置文件,加载该文件
94
- 3. **系统钥匙串**:从系统钥匙串获取(macOS Keychain)
95
- 4. **环境变量**:从环境变量读取(如 `CLAUDE_CODE_OAUTH_TOKEN`)
96
- 5. **交互输入**:最后提示用户输入并保存到配置文件
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、aliqwen_auth、kimi_auth、deepseek_auth)
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
- - **启动检查**:在 `EasyAIApp#run` 中自动执行版本检查
114
- - **强制更新**:`check_force_update!` 方法会阻塞执行直到检查完成
115
- - **跳过机制**:设置 `EASYAI_SKIP_FORCE_UPDATE=1` 环境变量或使用 `--help`、`--version` 命令时自动跳过
116
- - **更新命令**:`easyai update` 执行 `gem update easyai`
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` 中定义,只需更新 `VERSION` 常量即可。
185
+ 版本在 `lib/easyai/version.rb` 中定义,更新 `VERSION` 常量即可。
121
186
 
122
187
  ### 发布流程
123
- `release_remote.sh` 脚本完成以下步骤:
124
- 1. 提交所有未提交的更改(提交信息:`res 版本号`)
125
- 2. 合并到 master 分支
126
- 3. 构建和安装 gem
127
- 4. 创建并推送 Git 标签(格式:v版本号)
128
- 5. 发布到 RubyGems
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
- **重要**:`argv.remainder!` 必须在调用 `super` 之后执行。
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! # ✅ 正确:super 之后调用,使用 @argv
209
+ @args = @argv.remainder! # ✅ super 之后调用,使用 @argv
140
210
  end
141
211
  ```
142
212
 
143
- 原因:`argv.remainder!` 会消耗并清空 argv 中的所有剩余参数,如果在 `super` 之前调用,父类就无法获取 `--help` 等标志。
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
- ├── Claude
150
- ├── Gemini
151
- ├── GPT
220
+ ├── AIToolBase (abstract) ← 公共流程
221
+ ├── Claude
222
+ ├── Gemini
223
+ │ └── Codex
224
+ ├── Setup
152
225
  ├── Clean
153
226
  ├── Update
154
- ├── Setup
155
- └── Utils (abstract_command = true)
227
+ └── Utils (abstract)
156
228
  ├── Encry
157
- ├── Decry
158
- └── Export
229
+ └── Decry
159
230
  ```
160
231
 
161
232
  ## 添加新命令的标准流程
162
233
 
163
- 1. 创建命令文件 `lib/easyai/command/newcmd.rb`
164
- 2. 继承自 `EasyAI::Command`
165
- 3. 设置 `self.summary` `self.description`(使用中文)
166
- 4. 实现 `initialize` 方法(注意 `super` `argv.remainder!` 的顺序)
167
- 5. 实现 `validate!` 方法(可选,用于验证参数)
168
- 6. 实现 `run` 方法(主要逻辑)
169
- 7. 在 `lib/easyai.rb` require 新命令文件
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
- - `print_status(icon_text, detail)`:状态信息,图标左对齐,详情用 cyan 色
174
- - `print_success(message)`:成功信息,绿色勾号
175
- - `print_warning(message)`:警告信息,黄色警告符
176
- - `print_error(message)`:错误信息,红色叉号
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
- - **所有文档必须使用中文**:README.md、代码注释、提交信息、API 文档
265
+ - **所有用户界面必须使用中文**:命令描述、选项说明、错误信息、交互提示、状态信息
266
+ - **所有项目文档必须使用中文**:README.md、代码注释、提交信息
182
267
 
183
- ## JPS 认证集成
268
+ ## 安全约束
184
269
 
185
- 项目集成了 JPS 客户端认证系统(`lib/easyai/auth/jpsloginhelper.rb`):
186
- - **统一认证接口**:兼容原 JPSLogin 的接口,提供 `login()` `get_username()` 方法
187
- - **配置文件管理**:通过 `EasyAIConfig` 自动获取 `jps_client_config.json` 配置文件路径
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` 上传到代码仓库或日志服务