@adversity/coding-tool-x 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.
- package/CHANGELOG.md +333 -0
- package/LICENSE +21 -0
- package/README.md +404 -0
- package/bin/ctx.js +8 -0
- package/dist/web/assets/index-D1AYlFLZ.js +3220 -0
- package/dist/web/assets/index-aL3cKxSK.css +41 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/index.html +14 -0
- package/dist/web/logo.png +0 -0
- package/docs/CHANGELOG.md +582 -0
- package/docs/DIRECTORY_MIGRATION.md +112 -0
- package/docs/PROJECT_STRUCTURE.md +396 -0
- package/docs/bannel.png +0 -0
- package/docs/home.png +0 -0
- package/docs/logo.png +0 -0
- package/docs/multi-channel-load-balancing.md +249 -0
- package/package.json +73 -0
- package/src/commands/channels.js +504 -0
- package/src/commands/cli-type.js +99 -0
- package/src/commands/daemon.js +286 -0
- package/src/commands/doctor.js +332 -0
- package/src/commands/list.js +222 -0
- package/src/commands/logs.js +259 -0
- package/src/commands/port-config.js +115 -0
- package/src/commands/proxy-control.js +258 -0
- package/src/commands/proxy.js +152 -0
- package/src/commands/resume.js +137 -0
- package/src/commands/search.js +190 -0
- package/src/commands/stats.js +224 -0
- package/src/commands/switch.js +48 -0
- package/src/commands/toggle-proxy.js +222 -0
- package/src/commands/ui.js +92 -0
- package/src/commands/workspace.js +454 -0
- package/src/config/default.js +40 -0
- package/src/config/loader.js +75 -0
- package/src/config/paths.js +121 -0
- package/src/index.js +373 -0
- package/src/reset-config.js +92 -0
- package/src/server/api/agents.js +248 -0
- package/src/server/api/aliases.js +36 -0
- package/src/server/api/channels.js +258 -0
- package/src/server/api/claude-hooks.js +480 -0
- package/src/server/api/codex-channels.js +312 -0
- package/src/server/api/codex-projects.js +91 -0
- package/src/server/api/codex-proxy.js +182 -0
- package/src/server/api/codex-sessions.js +491 -0
- package/src/server/api/codex-statistics.js +57 -0
- package/src/server/api/commands.js +245 -0
- package/src/server/api/config-templates.js +182 -0
- package/src/server/api/config.js +147 -0
- package/src/server/api/convert.js +127 -0
- package/src/server/api/dashboard.js +125 -0
- package/src/server/api/env.js +144 -0
- package/src/server/api/favorites.js +77 -0
- package/src/server/api/gemini-channels.js +261 -0
- package/src/server/api/gemini-projects.js +91 -0
- package/src/server/api/gemini-proxy.js +160 -0
- package/src/server/api/gemini-sessions.js +397 -0
- package/src/server/api/gemini-statistics.js +57 -0
- package/src/server/api/health-check.js +118 -0
- package/src/server/api/mcp.js +336 -0
- package/src/server/api/pm2-autostart.js +269 -0
- package/src/server/api/projects.js +124 -0
- package/src/server/api/prompts.js +279 -0
- package/src/server/api/proxy.js +235 -0
- package/src/server/api/rules.js +271 -0
- package/src/server/api/sessions.js +595 -0
- package/src/server/api/settings.js +61 -0
- package/src/server/api/skills.js +305 -0
- package/src/server/api/statistics.js +91 -0
- package/src/server/api/terminal.js +202 -0
- package/src/server/api/ui-config.js +64 -0
- package/src/server/api/workspaces.js +407 -0
- package/src/server/codex-proxy-server.js +538 -0
- package/src/server/dev-server.js +26 -0
- package/src/server/gemini-proxy-server.js +518 -0
- package/src/server/index.js +305 -0
- package/src/server/proxy-server.js +469 -0
- package/src/server/services/agents-service.js +354 -0
- package/src/server/services/alias.js +71 -0
- package/src/server/services/channel-health.js +234 -0
- package/src/server/services/channel-scheduler.js +234 -0
- package/src/server/services/channels.js +347 -0
- package/src/server/services/codex-channels.js +625 -0
- package/src/server/services/codex-config.js +90 -0
- package/src/server/services/codex-parser.js +322 -0
- package/src/server/services/codex-sessions.js +665 -0
- package/src/server/services/codex-settings-manager.js +397 -0
- package/src/server/services/codex-speed-test-template.json +24 -0
- package/src/server/services/codex-statistics-service.js +255 -0
- package/src/server/services/commands-service.js +360 -0
- package/src/server/services/config-templates-service.js +732 -0
- package/src/server/services/env-checker.js +307 -0
- package/src/server/services/env-manager.js +300 -0
- package/src/server/services/favorites.js +163 -0
- package/src/server/services/gemini-channels.js +333 -0
- package/src/server/services/gemini-config.js +73 -0
- package/src/server/services/gemini-sessions.js +689 -0
- package/src/server/services/gemini-settings-manager.js +263 -0
- package/src/server/services/gemini-statistics-service.js +253 -0
- package/src/server/services/health-check.js +399 -0
- package/src/server/services/mcp-service.js +1188 -0
- package/src/server/services/prompts-service.js +492 -0
- package/src/server/services/proxy-runtime.js +79 -0
- package/src/server/services/pty-manager.js +435 -0
- package/src/server/services/rules-service.js +401 -0
- package/src/server/services/session-cache.js +127 -0
- package/src/server/services/session-converter.js +577 -0
- package/src/server/services/sessions.js +757 -0
- package/src/server/services/settings-manager.js +163 -0
- package/src/server/services/skill-service.js +965 -0
- package/src/server/services/speed-test.js +545 -0
- package/src/server/services/statistics-service.js +386 -0
- package/src/server/services/terminal-commands.js +155 -0
- package/src/server/services/terminal-config.js +140 -0
- package/src/server/services/terminal-detector.js +306 -0
- package/src/server/services/ui-config.js +130 -0
- package/src/server/services/workspace-service.js +662 -0
- package/src/server/utils/pricing.js +41 -0
- package/src/server/websocket-server.js +557 -0
- package/src/ui/menu.js +129 -0
- package/src/ui/prompts.js +100 -0
- package/src/utils/format.js +43 -0
- package/src/utils/port-helper.js +94 -0
- package/src/utils/session.js +239 -0
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
# 更新日志
|
|
2
|
+
|
|
3
|
+
## v1.5.0 (最新) - 2025-11-24
|
|
4
|
+
|
|
5
|
+
### ✨ 新功能
|
|
6
|
+
|
|
7
|
+
- **自动更新** - 新增 `ctx update` 命令,支持检查并自动更新到最新版本
|
|
8
|
+
- **版本提醒** - Web UI 打开时自动检测新版本,显示更新提示
|
|
9
|
+
- **UI 美化** - 重新设计 Header Logo 区域,采用上下排列布局和渐变效果
|
|
10
|
+
- **图标优化** - 更换 Claude/Gemini 图标为更合适的语义化图标(聊天气泡/闪光)
|
|
11
|
+
|
|
12
|
+
### 🐛 Bug 修复
|
|
13
|
+
|
|
14
|
+
- 修复项目路径中下划线 `_` 被错误转换为 `-` 的问题,导致"使用对话"功能无法正确打开目录
|
|
15
|
+
- 修复首页三列底部边框被裁剪的布局问题
|
|
16
|
+
- 修复 Dialog/Message 组件在暗色模式下未正确适配的问题
|
|
17
|
+
- 修复 Gemini 最新对话抽屉错误显示 Claude 数据的问题
|
|
18
|
+
|
|
19
|
+
### 🔧 优化
|
|
20
|
+
|
|
21
|
+
- 清理前后端调试日志,控制台输出更干净
|
|
22
|
+
- 优化成本计算设置 UI,改为一行一个的布局
|
|
23
|
+
- 移除无用的全局 loading 超时警告
|
|
24
|
+
- 收窄设置抽屉宽度,布局更紧凑
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## v2.0.0 - 2025-11-20
|
|
29
|
+
|
|
30
|
+
### 🎉 重大更新:多渠道管理 & 实时监控
|
|
31
|
+
|
|
32
|
+
#### 新增功能
|
|
33
|
+
|
|
34
|
+
**🔀 多渠道管理系统**
|
|
35
|
+
- ✨ API 渠道可视化管理(添加、编辑、删除)
|
|
36
|
+
- ⚡ 动态切换渠道,无需重启 ClaudeCode
|
|
37
|
+
- 🎨 渠道卡片支持拖拽排序和折叠
|
|
38
|
+
- 🔒 API Key 脱敏显示,防止泄露
|
|
39
|
+
- 🌐 支持官网链接快速跳转
|
|
40
|
+
- 💾 渠道配置持久化存储
|
|
41
|
+
|
|
42
|
+
**📡 实时日志监控**
|
|
43
|
+
- 🎯 WebSocket 实时推送日志
|
|
44
|
+
- 📊 Token 统计(请求/回复/缓存写入/缓存命中)
|
|
45
|
+
- 🏷️ 行为日志(渠道切换、会话启动)
|
|
46
|
+
- 🔍 模型信息悬浮提示
|
|
47
|
+
- 💾 日志持久化(最多100条)
|
|
48
|
+
- 🗑️ 一键清空日志
|
|
49
|
+
|
|
50
|
+
**🔍 全局搜索功能**
|
|
51
|
+
- ⌨️ 快捷键支持(⌘/Ctrl + K)
|
|
52
|
+
- 🌐 跨项目搜索会话内容
|
|
53
|
+
- 🎯 高亮显示匹配关键词
|
|
54
|
+
- 📊 显示匹配次数和上下文
|
|
55
|
+
- 🚀 一键启动搜索到的会话
|
|
56
|
+
|
|
57
|
+
**🎨 用户体验优化**
|
|
58
|
+
- 🎭 面板可见性控制(渠道列表/实时日志)
|
|
59
|
+
- 📱 状态持久化(localStorage)
|
|
60
|
+
- 🌊 流畅动画效果
|
|
61
|
+
- 📦 项目卡片拖拽排序
|
|
62
|
+
- 🕐 最近对话抽屉
|
|
63
|
+
|
|
64
|
+
#### 技术架构升级
|
|
65
|
+
|
|
66
|
+
**后端服务**
|
|
67
|
+
- Express.js Web 服务器
|
|
68
|
+
- HTTP 代理服务器(动态切换核心)
|
|
69
|
+
- WebSocket 服务器(实时通信)
|
|
70
|
+
- RESTful API 架构
|
|
71
|
+
|
|
72
|
+
**前端重构**
|
|
73
|
+
- Vue 3 + Naive UI 组件库
|
|
74
|
+
- Pinia 状态管理
|
|
75
|
+
- Vue Router 路由管理
|
|
76
|
+
- VueDraggable 拖拽排序
|
|
77
|
+
- Vite 构建工具
|
|
78
|
+
|
|
79
|
+
**新增 API 路由**
|
|
80
|
+
- `/api/channels` - 渠道管理
|
|
81
|
+
- `/api/proxy` - 代理控制
|
|
82
|
+
- `/api/sessions/search` - 全局搜索
|
|
83
|
+
- `/ws` - WebSocket 连接
|
|
84
|
+
|
|
85
|
+
#### 性能优化
|
|
86
|
+
|
|
87
|
+
- ⚙️ API 轮询从 5s 优化到 30s
|
|
88
|
+
- 🔄 WebSocket 重连机制(最多3次,指数退避)
|
|
89
|
+
- 🚀 大文件加载优化
|
|
90
|
+
- 💾 配置文件缓存
|
|
91
|
+
|
|
92
|
+
#### Bug 修复
|
|
93
|
+
|
|
94
|
+
- 🐛 修复 WebSocket 重复连接问题
|
|
95
|
+
- 🐛 修复项目列表加载问题
|
|
96
|
+
- 🐛 修复路由匹配错误
|
|
97
|
+
- 🐛 修复添加渠道后表单未清空
|
|
98
|
+
- 🐛 修复实时日志底部被遮挡
|
|
99
|
+
|
|
100
|
+
#### 配置文件
|
|
101
|
+
|
|
102
|
+
新增配置文件存储在 `~/.claude/cc-tool/`:
|
|
103
|
+
- `channels.json` - API 渠道配置
|
|
104
|
+
- `proxy-logs.json` - 实时日志持久化
|
|
105
|
+
- `project-order.json` - 项目排序
|
|
106
|
+
- `recent-sessions.json` - 最近会话
|
|
107
|
+
|
|
108
|
+
#### 版本变更
|
|
109
|
+
|
|
110
|
+
- **版本号**: 1.3.0 → 2.0.0
|
|
111
|
+
- **重大更新**: 全新的多渠道管理和实时监控系统
|
|
112
|
+
- **向后兼容**: 原有功能完全保留,配置自动迁移
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## v1.3.0 - 2025-11-19
|
|
117
|
+
|
|
118
|
+
### 🎉 重大重构:模块化架构
|
|
119
|
+
|
|
120
|
+
#### 代码重构
|
|
121
|
+
将单一的 600+ 行 `index.js` 重构为模块化架构。
|
|
122
|
+
|
|
123
|
+
**新的目录结构**:
|
|
124
|
+
```
|
|
125
|
+
cc-cli/
|
|
126
|
+
├── bin/ # CLI 入口
|
|
127
|
+
├── src/ # 源代码
|
|
128
|
+
│ ├── commands/ # 命令处理
|
|
129
|
+
│ ├── utils/ # 工具函数
|
|
130
|
+
│ ├── ui/ # UI 相关
|
|
131
|
+
│ └── config/ # 配置管理
|
|
132
|
+
├── docs/ # 文档
|
|
133
|
+
└── test/ # 测试
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### 改进点
|
|
137
|
+
|
|
138
|
+
1. **模块化设计**
|
|
139
|
+
- ✅ 12 个模块文件,职责明确
|
|
140
|
+
- ✅ 命令、工具、UI、配置分离
|
|
141
|
+
- ✅ 低耦合、高内聚
|
|
142
|
+
|
|
143
|
+
2. **标准化结构**
|
|
144
|
+
- ✅ 符合 npm 包规范
|
|
145
|
+
- ✅ 清晰的 bin 入口
|
|
146
|
+
- ✅ 完整的 .gitignore 和 .npmignore
|
|
147
|
+
|
|
148
|
+
3. **可维护性**
|
|
149
|
+
- ✅ 易于定位和修改代码
|
|
150
|
+
- ✅ 易于添加新功能
|
|
151
|
+
- ✅ 易于编写单元测试
|
|
152
|
+
|
|
153
|
+
4. **文档完善**
|
|
154
|
+
- ✅ 添加 PROJECT_STRUCTURE.md
|
|
155
|
+
- ✅ 文档集中到 docs/ 目录
|
|
156
|
+
|
|
157
|
+
#### 版本升级
|
|
158
|
+
|
|
159
|
+
- **版本号**: 1.2.1 → 1.3.0
|
|
160
|
+
- **主版本号变更**: 内部架构重大变更
|
|
161
|
+
- **向后兼容**: 功能和使用方式完全保持一致
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## v1.2.1 - 2025-11-19
|
|
166
|
+
|
|
167
|
+
### ✨ 简化显示格式
|
|
168
|
+
|
|
169
|
+
#### 改为单行紧凑格式
|
|
170
|
+
|
|
171
|
+
**新格式**:
|
|
172
|
+
```
|
|
173
|
+
1. 8小时前 │ 58.1KB │ jly-20251106-orderCenter │ 实现订单中心支付功能
|
|
174
|
+
2. 1天前 │ 19.4KB │ customerComplaint │ 修复客户投诉系统响应时间
|
|
175
|
+
3. 2天前 │ 108.6KB │ main │ 添加用户权限管理功能
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**改进点**:
|
|
179
|
+
1. **单行显示** - 所有信息在一行,清晰紧凑
|
|
180
|
+
2. **显示第一条消息** - 用户在第一条消息描述会话目的,更易识别
|
|
181
|
+
3. **清理加载信息** - 使用 `console.clear()` 移除加载动画残留
|
|
182
|
+
4. **统一格式** - 列表和搜索结果使用相同的显示格式
|
|
183
|
+
|
|
184
|
+
**对比旧版本**:
|
|
185
|
+
- ❌ 旧版:多行显示,显示最后一条消息
|
|
186
|
+
- ✅ 新版:单行显示,显示第一条消息
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
### ✨ 优化 Fork 选择体验
|
|
191
|
+
|
|
192
|
+
#### 改进 Fork 选择方式
|
|
193
|
+
|
|
194
|
+
**旧方式**(v1.2.0):
|
|
195
|
+
```
|
|
196
|
+
是否创建新分支 (fork)? [原会话继续请选N] (y/N)
|
|
197
|
+
```
|
|
198
|
+
- 需要输入 Y/N
|
|
199
|
+
- 不够直观
|
|
200
|
+
- 没有详细说明
|
|
201
|
+
|
|
202
|
+
**新方式**(v1.2.1):
|
|
203
|
+
```
|
|
204
|
+
选择恢复方式:
|
|
205
|
+
📝 继续原会话 (推荐) - 在原会话上继续对话,所有内容会追加到原文件
|
|
206
|
+
🌿 创建新分支 (Fork) - 基于原会话创建新会话,保留原会话不变
|
|
207
|
+
──────────────
|
|
208
|
+
↩️ 返回重新选择
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### 改进点
|
|
212
|
+
|
|
213
|
+
1. **箭头键选择** - 不需要输入 Y/N,用上下箭头选择
|
|
214
|
+
2. **默认选项** - 默认选中"继续原会话"(最常用)
|
|
215
|
+
3. **详细说明** - 每个选项都有清晰的说明
|
|
216
|
+
4. **可以返回** - 选错了可以返回重新选择
|
|
217
|
+
5. **视觉区分** - 用颜色和图标区分选项
|
|
218
|
+
|
|
219
|
+
#### 新增 Fork 使用指南
|
|
220
|
+
|
|
221
|
+
创建了详细的 `FORK_GUIDE.md` 文档,解释:
|
|
222
|
+
- Fork 的真正作用
|
|
223
|
+
- 何时应该使用 Fork
|
|
224
|
+
- 何时不应该使用 Fork
|
|
225
|
+
- 常见误解和正确用法
|
|
226
|
+
- 实战案例
|
|
227
|
+
|
|
228
|
+
### 🎓 Fork 功能说明
|
|
229
|
+
|
|
230
|
+
#### Fork ≠ 继续对话
|
|
231
|
+
|
|
232
|
+
很多人误解:
|
|
233
|
+
> ❌ Fork 是让我可以从上次的地方继续对话
|
|
234
|
+
|
|
235
|
+
实际上:
|
|
236
|
+
> ✅ 直接选择"继续原会话"就能从上次的地方继续
|
|
237
|
+
> ✅ Fork 是创建一个新的独立会话
|
|
238
|
+
|
|
239
|
+
#### Fork 的真正作用
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
原会话 (abc123.jsonl) Fork后 (xyz789.jsonl)
|
|
243
|
+
├─ 对话1: 实现功能A ├─ [复制] 对话1: 实现功能A
|
|
244
|
+
├─ 对话2: 添加功能B ├─ [复制] 对话2: 添加功能B
|
|
245
|
+
└─ 对话3: 测试完成 └─ [新方向] 尝试不同实现
|
|
246
|
+
↓ ↓
|
|
247
|
+
保持不变 独立发展
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
#### 使用场景
|
|
251
|
+
|
|
252
|
+
**应该 Fork 的情况**:
|
|
253
|
+
- ✅ 想尝试不同的技术方案(保留原方案)
|
|
254
|
+
- ✅ 要做大幅度重构(保留稳定版本)
|
|
255
|
+
- ✅ 实验性修改(失败可回退)
|
|
256
|
+
|
|
257
|
+
**不需要 Fork 的情况**:
|
|
258
|
+
- ⭐ 正常继续工作 → 选择"继续原会话"
|
|
259
|
+
- ⭐ 修复 bug → 选择"继续原会话"
|
|
260
|
+
- ⭐ 增加新功能 → 选择"继续原会话"
|
|
261
|
+
|
|
262
|
+
> **记住:99% 的情况选择"继续原会话"!**
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## v1.2.0 - 2025-11-19
|
|
267
|
+
|
|
268
|
+
### ✨ UI 全面升级
|
|
269
|
+
|
|
270
|
+
#### 1. 🎨 美化会话列表显示
|
|
271
|
+
|
|
272
|
+
**新的布局格式**:
|
|
273
|
+
```
|
|
274
|
+
1. 8小时前 │ 58.1KB │ jly-20251106-orderCenter
|
|
275
|
+
💬 实现订单中心支付功能
|
|
276
|
+
|
|
277
|
+
2. 1天前 │ 19.4KB │ customerComplaint
|
|
278
|
+
📝 修复客户投诉系统的响应时间问题
|
|
279
|
+
|
|
280
|
+
3. 2天前 │ 108.6KB │ main
|
|
281
|
+
💬 添加用户权限管理功能
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**改进点**:
|
|
285
|
+
- ✅ 清晰的列结构(时间 │ 大小 │ 分支)
|
|
286
|
+
- ✅ 自动简化分支名(去掉 feature/、feat/、fix/ 前缀)
|
|
287
|
+
- ✅ 显示最后一次对话内容
|
|
288
|
+
- ✅ 使用图标区分内容类型(💬 对话、📝 摘要)
|
|
289
|
+
|
|
290
|
+
#### 2. 💬 展示最后对话内容
|
|
291
|
+
|
|
292
|
+
**功能**:
|
|
293
|
+
- 自动提取最后一次助手回复或用户消息
|
|
294
|
+
- 优先显示助手的回复(帮助回忆对话结果)
|
|
295
|
+
- 如果没有,显示用户的最后问题
|
|
296
|
+
- 截断长文本(最多80字符)
|
|
297
|
+
|
|
298
|
+
**技术实现**:
|
|
299
|
+
- 大文件(>10MB):只读取开头 8KB + 结尾 8KB
|
|
300
|
+
- 小文件:读取全部但只解析前10行和后20行
|
|
301
|
+
- 性能:不影响加载速度
|
|
302
|
+
|
|
303
|
+
#### 3. 🔄 添加快捷操作
|
|
304
|
+
|
|
305
|
+
**在会话列表中新增**:
|
|
306
|
+
```
|
|
307
|
+
──────────────────────────────────────────
|
|
308
|
+
↩️ 返回主菜单
|
|
309
|
+
🔀 切换项目
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**在搜索结果中新增**:
|
|
313
|
+
```
|
|
314
|
+
──────────────────────────────────────────
|
|
315
|
+
↩️ 返回主菜单
|
|
316
|
+
🔎 重新搜索
|
|
317
|
+
🔀 切换项目
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**好处**:
|
|
321
|
+
- 不用按 Esc 或 Ctrl+C 返回
|
|
322
|
+
- 可以直接在列表中切换项目
|
|
323
|
+
- 搜索失败可以立即重新搜索
|
|
324
|
+
|
|
325
|
+
#### 4. 🎯 优化主菜单图标
|
|
326
|
+
|
|
327
|
+
**旧图标 → 新图标**:
|
|
328
|
+
- 📋 → 💼 (更商务)
|
|
329
|
+
- 🔍 → 🔎 (更清晰)
|
|
330
|
+
- 🔄 → 🔀 (更准确表达切换)
|
|
331
|
+
- ❌ → 👋 (更友好)
|
|
332
|
+
|
|
333
|
+
#### 5. 🌈 改进颜色方案
|
|
334
|
+
|
|
335
|
+
- **序号**:白色加粗(更醒目)
|
|
336
|
+
- **时间**:青色(容易区分)
|
|
337
|
+
- **大小**:灰色(不抢眼)
|
|
338
|
+
- **分支**:绿色(清晰标识)
|
|
339
|
+
- **对话内容**:白色(主要信息)
|
|
340
|
+
- **摘要**:黄色(区分类型)
|
|
341
|
+
|
|
342
|
+
### 📊 对比效果
|
|
343
|
+
|
|
344
|
+
| 项目 | v1.1.1 | v1.2.0 |
|
|
345
|
+
|------|--------|--------|
|
|
346
|
+
| 显示对话内容 | ❌ | ✅ 显示最后对话 |
|
|
347
|
+
| 返回主菜单 | ❌ 需要 Ctrl+C | ✅ 直接选择 |
|
|
348
|
+
| 在列表切换项目 | ❌ | ✅ 支持 |
|
|
349
|
+
| 分支名显示 | 完整 | 简化(去前缀)|
|
|
350
|
+
| 布局清晰度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
351
|
+
|
|
352
|
+
### 🚀 性能优化
|
|
353
|
+
|
|
354
|
+
- 大文件加载依然快速(只读取必要部分)
|
|
355
|
+
- 新增的最后对话提取不影响性能
|
|
356
|
+
- 内存占用无明显增加
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## v1.1.1 - 2025-11-19
|
|
361
|
+
|
|
362
|
+
### 🐛 修复严重 Bug:Ctrl+C 退出后的错误
|
|
363
|
+
|
|
364
|
+
#### 问题描述
|
|
365
|
+
用户按 Ctrl+C 退出 Claude 后,终端显示:
|
|
366
|
+
```
|
|
367
|
+
Error: read EIO
|
|
368
|
+
at TTY.onStreamRead
|
|
369
|
+
```
|
|
370
|
+
并且终端卡住,无法响应 Ctrl+C,必须关闭终端窗口。
|
|
371
|
+
|
|
372
|
+
#### 根本原因
|
|
373
|
+
1. **stdin 监听器残留** - inquirer 的监听器没有清理
|
|
374
|
+
2. **TTY 状态异常** - stdin 处于暂停状态但有残留事件
|
|
375
|
+
3. **错误未捕获** - EIO 错误抛出到顶层
|
|
376
|
+
4. **进程清理失败** - Node.js 试图清理 TTY 时失败
|
|
377
|
+
|
|
378
|
+
#### 修复方案
|
|
379
|
+
|
|
380
|
+
**1. 移除所有 stdin 监听器**
|
|
381
|
+
```javascript
|
|
382
|
+
process.stdin.removeAllListeners();
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**2. 添加 stdin 错误处理器**
|
|
386
|
+
```javascript
|
|
387
|
+
process.stdin.on('error', (err) => {
|
|
388
|
+
if (err.code === 'EIO' || err.code === 'ENOTTY') {
|
|
389
|
+
process.exit(0); // 安静退出,不显示错误
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
**3. 全局错误捕获**
|
|
395
|
+
```javascript
|
|
396
|
+
process.on('uncaughtException', (err) => {
|
|
397
|
+
if (err.code === 'EIO' || err.code === 'ENOTTY' || err.code === 'EPIPE') {
|
|
398
|
+
process.exit(0);
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**4. 捕获 SIGINT 信号**
|
|
404
|
+
```javascript
|
|
405
|
+
process.on('SIGINT', () => {
|
|
406
|
+
process.exit(0); // Ctrl+C 优雅退出
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**5. 处理 Claude 的 SIGINT 退出**
|
|
411
|
+
```javascript
|
|
412
|
+
catch (error) {
|
|
413
|
+
if (error.signal === 'SIGINT') {
|
|
414
|
+
// 用户按了 Ctrl+C,正常退出
|
|
415
|
+
process.exit(0);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
#### 修复效果
|
|
421
|
+
|
|
422
|
+
| 场景 | v1.1 | v1.1.1 |
|
|
423
|
+
|------|------|--------|
|
|
424
|
+
| Ctrl+C 退出 Claude | ❌ 抛出 EIO 错误 | ✅ 安静退出 |
|
|
425
|
+
| 终端卡住 | ❌ 必须关闭终端 | ✅ 立即响应 |
|
|
426
|
+
| 错误信息 | ❌ 显示堆栈 | ✅ 干净退出 |
|
|
427
|
+
|
|
428
|
+
### 其他改进
|
|
429
|
+
|
|
430
|
+
- 添加目录切换失败的友好提示
|
|
431
|
+
- 优化错误处理逻辑
|
|
432
|
+
- 改进退出流程,避免清理错误
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## v1.1 - 2025-11-19
|
|
437
|
+
|
|
438
|
+
### 🎯 重大改进:完全修复输入卡顿问题
|
|
439
|
+
|
|
440
|
+
#### 核心改变
|
|
441
|
+
使用 `execSync` 替代 `spawn`,让 **cc 完全让出终端控制权给 Claude**
|
|
442
|
+
|
|
443
|
+
#### 之前的问题
|
|
444
|
+
```
|
|
445
|
+
cc (inquirer raw mode)
|
|
446
|
+
↓ spawn
|
|
447
|
+
claude 启动
|
|
448
|
+
↓
|
|
449
|
+
两个进程同时监听输入 → 输入卡顿、丢字
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
#### 现在的方案
|
|
453
|
+
```
|
|
454
|
+
cc (inquirer raw mode)
|
|
455
|
+
↓ 清理终端状态
|
|
456
|
+
↓ execSync (阻塞等待)
|
|
457
|
+
claude 完全接管终端
|
|
458
|
+
↓
|
|
459
|
+
cc 只是等待,不处理输入 → 输入流畅!
|
|
460
|
+
↓
|
|
461
|
+
claude 退出 → cc 也退出
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### ✨ 新功能
|
|
465
|
+
|
|
466
|
+
1. **加载动画**
|
|
467
|
+
- 输入 Y/N 后立即显示旋转动画
|
|
468
|
+
- "正在准备启动 Claude..."
|
|
469
|
+
- 提供视觉反馈,不会感觉卡顿
|
|
470
|
+
|
|
471
|
+
2. **更清晰的提示**
|
|
472
|
+
```
|
|
473
|
+
⠸ 正在准备启动 Claude...
|
|
474
|
+
✔ 准备完成!
|
|
475
|
+
|
|
476
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
477
|
+
✨ 会话: c5f7a8f7
|
|
478
|
+
📁 目录: /Users/xxx/project
|
|
479
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
3. **终端状态清理**
|
|
483
|
+
- 自动关闭 inquirer 的 raw mode
|
|
484
|
+
- 暂停输入流
|
|
485
|
+
- 延迟 100ms 确保状态稳定
|
|
486
|
+
|
|
487
|
+
### 🐛 修复的问题
|
|
488
|
+
|
|
489
|
+
| 问题 | 状态 |
|
|
490
|
+
|------|------|
|
|
491
|
+
| 输入 4 个字只显示 2 个 | ✅ 已修复 |
|
|
492
|
+
| 输入不生效 | ✅ 已修复 |
|
|
493
|
+
| 按键卡顿延迟 | ✅ 已修复 |
|
|
494
|
+
| 输入 Y/N 后无反馈 | ✅ 已修复(加载动画)|
|
|
495
|
+
| 等待很久才进入对话 | ✅ 已修复(视觉反馈)|
|
|
496
|
+
|
|
497
|
+
### 🔧 技术细节
|
|
498
|
+
|
|
499
|
+
#### 使用 `execSync` 的优势
|
|
500
|
+
|
|
501
|
+
```javascript
|
|
502
|
+
// 旧方案:spawn(异步,父子进程同时存在)
|
|
503
|
+
const child = spawn('claude', args, { stdio: 'inherit' });
|
|
504
|
+
// ❌ cc 和 claude 都在运行
|
|
505
|
+
// ❌ 都可能监听输入
|
|
506
|
+
// ❌ 导致冲突
|
|
507
|
+
|
|
508
|
+
// 新方案:execSync(同步,父进程阻塞)
|
|
509
|
+
execSync('claude -r xxx', { stdio: 'inherit' });
|
|
510
|
+
// ✅ cc 阻塞等待,不处理任何输入
|
|
511
|
+
// ✅ claude 独占终端
|
|
512
|
+
// ✅ 零冲突
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
#### 状态清理流程
|
|
516
|
+
|
|
517
|
+
1. **关闭 raw mode**
|
|
518
|
+
```javascript
|
|
519
|
+
process.stdin.setRawMode(false);
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
2. **暂停输入流**
|
|
523
|
+
```javascript
|
|
524
|
+
process.stdin.pause();
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
3. **延迟稳定**
|
|
528
|
+
```javascript
|
|
529
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
4. **启动 Claude**
|
|
533
|
+
```javascript
|
|
534
|
+
execSync(command, { stdio: 'inherit' });
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### 📊 性能对比
|
|
538
|
+
|
|
539
|
+
| 指标 | v1.0 | v1.1 | 改进 |
|
|
540
|
+
|------|------|------|------|
|
|
541
|
+
| 输入延迟 | 200-500ms | <10ms | 20-50x |
|
|
542
|
+
| 输入丢失率 | 50% | 0% | ∞ |
|
|
543
|
+
| 启动反馈 | 无 | 加载动画 | ✅ |
|
|
544
|
+
| 进程干扰 | 有 | 无 | ✅ |
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## v1.0 - 2025-11-19
|
|
549
|
+
|
|
550
|
+
### 初始版本
|
|
551
|
+
|
|
552
|
+
- ✅ 交互式会话列表
|
|
553
|
+
- ✅ 搜索功能
|
|
554
|
+
- ✅ 切换项目
|
|
555
|
+
- ✅ 性能优化(大文件快速加载)
|
|
556
|
+
- ✅ 美化 UI
|
|
557
|
+
- ❌ 输入卡顿问题(已在 v1.1 修复)
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
## 升级说明
|
|
562
|
+
|
|
563
|
+
如果你使用的是 v1.0,只需更新代码即可,无需重新安装:
|
|
564
|
+
|
|
565
|
+
```bash
|
|
566
|
+
cd /Users/lilithgames/Desktop/cc-cli
|
|
567
|
+
# 代码已经自动更新
|
|
568
|
+
# 直接使用即可
|
|
569
|
+
cc
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
## 已知问题
|
|
573
|
+
|
|
574
|
+
无
|
|
575
|
+
|
|
576
|
+
## 计划功能
|
|
577
|
+
|
|
578
|
+
- [ ] 会话收藏功能
|
|
579
|
+
- [ ] 会话标签/分类
|
|
580
|
+
- [ ] 更多搜索选项(按时间、按分支)
|
|
581
|
+
- [ ] 导出会话历史
|
|
582
|
+
- [ ] 配置向导
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# CTX 工具目录结构迁移说明
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
为避免与原始 `ct` 工具冲突,`ctx` 工具的所有数据目录已从 `~/.claude/cc-tool` 迁移到独立的 `~/.ctx` 目录。
|
|
6
|
+
|
|
7
|
+
## 新目录结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
~/.ctx/ # CTX 工具根目录
|
|
11
|
+
├── projects/ # 项目配置和会话存储
|
|
12
|
+
│ └── {projectName}/ # 项目目录
|
|
13
|
+
│ ├── .claude-project.json # 项目配置文件
|
|
14
|
+
│ └── {sessionId}.jsonl # Claude 会话文件
|
|
15
|
+
├── config.json # CTX 主配置文件
|
|
16
|
+
├── logs/ # 日志目录
|
|
17
|
+
│ ├── cc-tool-out.log # 输出日志
|
|
18
|
+
│ └── cc-tool-error.log # 错误日志
|
|
19
|
+
├── aliases.json # 会话别名
|
|
20
|
+
├── favorites.json # 收藏夹
|
|
21
|
+
├── channels.json # Claude 渠道配置
|
|
22
|
+
├── codex-channels.json # Codex 渠道配置
|
|
23
|
+
├── gemini-channels.json # Gemini 渠道配置
|
|
24
|
+
├── active-channel.json # Claude 当前激活渠道
|
|
25
|
+
├── codex-active-channel.json # Codex 当前激活渠道
|
|
26
|
+
├── gemini-active-channel.json # Gemini 当前激活渠道
|
|
27
|
+
├── statistics.json # Claude 统计数据
|
|
28
|
+
├── codex-statistics.json # Codex 统计数据
|
|
29
|
+
├── gemini-statistics.json # Gemini 统计数据
|
|
30
|
+
├── daily-stats/ # Claude 每日统计
|
|
31
|
+
├── codex-daily-stats/ # Codex 每日统计
|
|
32
|
+
├── gemini-daily-stats/ # Gemini 每日统计
|
|
33
|
+
├── session-cache.json # 会话缓存
|
|
34
|
+
├── project-order.json # 项目排序
|
|
35
|
+
├── fork-relations.json # 会话 Fork 关系
|
|
36
|
+
├── env-backups/ # 环境配置备份
|
|
37
|
+
├── ui-config.json # UI 配置
|
|
38
|
+
├── notify-hook.js # 飞书通知钩子
|
|
39
|
+
├── mcp-config.json # MCP 服务器配置
|
|
40
|
+
├── terminal-config.json # 终端配置
|
|
41
|
+
├── prompts.json # 自定义提示词
|
|
42
|
+
├── proxy-runtime.json # Claude 代理运行时状态
|
|
43
|
+
├── codex-proxy-runtime.json # Codex 代理运行时状态
|
|
44
|
+
└── gemini-proxy-runtime.json # Gemini 代理运行时状态
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 工具原生配置路径(不变)
|
|
48
|
+
|
|
49
|
+
以下路径仍使用各工具的原生路径,不受迁移影响:
|
|
50
|
+
|
|
51
|
+
### Claude Code
|
|
52
|
+
- `~/.claude/settings.json` - Claude Code 配置
|
|
53
|
+
- `~/.claude/settings.json.cc-tool-backup` - CTX 工具备份
|
|
54
|
+
- `~/.claude/projects/` - Claude 原生项目目录(仅供参考,CTX 不直接使用)
|
|
55
|
+
- `~/.claude/skills/` - Claude Skills 安装目录
|
|
56
|
+
|
|
57
|
+
### Codex
|
|
58
|
+
- `~/.codex/config.toml` - Codex 配置
|
|
59
|
+
- `~/.codex/config.toml.cc-tool-backup` - CTX 工具备份
|
|
60
|
+
- `~/.codex/auth.json` - Codex 认证
|
|
61
|
+
- `~/.codex/auth.json.cc-tool-backup` - CTX 工具备份
|
|
62
|
+
- `~/.codex/sessions/` - Codex 原生会话目录
|
|
63
|
+
|
|
64
|
+
### Gemini
|
|
65
|
+
- `~/.gemini/.env` - Gemini 环境配置
|
|
66
|
+
- `~/.gemini/.env.cc-tool-backup` - CTX 工具备份
|
|
67
|
+
- `~/.gemini/tmp/` - Gemini 临时文件目录
|
|
68
|
+
|
|
69
|
+
## 配置文件引用
|
|
70
|
+
|
|
71
|
+
所有需要使用路径的模块,请引入统一的路径配置:
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
const { PATHS, NATIVE_PATHS } = require('./config/paths');
|
|
75
|
+
|
|
76
|
+
// 使用 CTX 工具目录
|
|
77
|
+
const channelsPath = PATHS.channels.claude;
|
|
78
|
+
|
|
79
|
+
// 使用工具原生配置
|
|
80
|
+
const claudeSettings = NATIVE_PATHS.claude.settings;
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 迁移步骤
|
|
84
|
+
|
|
85
|
+
如果您已经有旧的 `~/.claude/cc-tool` 数据,可以通过以下方式迁移:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# 1. 停止所有服务
|
|
89
|
+
ctx daemon stop
|
|
90
|
+
ctx proxy stop
|
|
91
|
+
|
|
92
|
+
# 2. 迁移数据目录
|
|
93
|
+
cp -r ~/.claude/cc-tool/* ~/.ctx/
|
|
94
|
+
|
|
95
|
+
# 3. 更新项目配置路径(如果项目在 ~/.claude/projects/)
|
|
96
|
+
# 编辑 ~/.ctx/projects/*/. claude-project.json 中的 path 字段
|
|
97
|
+
|
|
98
|
+
# 4. 重新启动服务
|
|
99
|
+
ctx daemon start
|
|
100
|
+
ctx ui
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 兼容性说明
|
|
104
|
+
|
|
105
|
+
- **向后兼容**:如果检测到 `~/.claude/cc-tool` 目录存在,会自动提示迁移
|
|
106
|
+
- **工具隔离**:原始 `ct` 工具和 `ctx` 工具完全独立,互不影响
|
|
107
|
+
- **配置独立**:渠道配置、统计数据、别名等完全分离
|
|
108
|
+
|
|
109
|
+
## 更新日志
|
|
110
|
+
|
|
111
|
+
- **v2.3.0** - 引入独立的 `~/.ctx` 目录结构
|
|
112
|
+
- 之前版本使用 `~/.claude/cc-tool` 目录
|