@minniexcode/codex-switch 0.0.11 → 0.0.12
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/README.AI.md +56 -98
- package/README.CN.md +90 -126
- package/README.md +63 -97
- package/dist/app/get-status.js +8 -3
- package/dist/app/list-providers.js +48 -1
- package/dist/cli/output.js +145 -18
- package/dist/commands/handlers.js +10 -6
- package/dist/commands/help.js +9 -5
- package/dist/commands/registry.js +15 -12
- package/dist/domain/runtime-state.js +30 -8
- package/dist/infra/config-repo.js +16 -206
- package/dist/interaction/interactive.js +16 -6
- package/dist/runtime/copilot-bridge.js +2 -1
- package/dist/storage/config-repo.js +0 -23
- package/docs/Design/codex-switch-v0.0.12-design.md +343 -0
- package/docs/PRD/codex-switch-prd-v0.0.12.md +279 -0
- package/docs/PRD/codex-switch-prd-v0.1.0.md +125 -237
- package/docs/Tests/testing.md +39 -112
- package/docs/cli-usage.md +138 -439
- package/docs/codex-switch-command-design.md +3 -0
- package/docs/codex-switch-product-overview.md +52 -207
- package/docs/codex-switch-technical-architecture.md +3 -0
- package/package.json +1 -1
- package/dist/app/rollback-latest.js +0 -26
|
@@ -2,240 +2,85 @@
|
|
|
2
2
|
|
|
3
3
|
## 文档定位
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
这份文档介绍当前活跃产品事实源下的 `codex-switch` 产品定位。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
当前 release contract 以这些文档为准:
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
- 正式 PRD:[`PRD/codex-switch-prd.md`](./PRD/codex-switch-prd.md)
|
|
13
|
-
- 技术架构设计:[`codex-switch-technical-architecture.md`](./codex-switch-technical-architecture.md)
|
|
14
|
-
- 命令设计说明:[`codex-switch-command-design.md`](./codex-switch-command-design.md)
|
|
9
|
+
- [`cli-usage.md`](./cli-usage.md)
|
|
10
|
+
- [`PRD/codex-switch-prd-v0.0.12.md`](./PRD/codex-switch-prd-v0.0.12.md)
|
|
11
|
+
- [`Design/codex-switch-v0.0.12-design.md`](./Design/codex-switch-v0.0.12-design.md)
|
|
15
12
|
|
|
16
13
|
## 产品概述
|
|
17
14
|
|
|
18
|
-
`codex-switch`
|
|
15
|
+
`codex-switch` 是一个本地 provider 管理 CLI,用于管理和切换目标 Codex runtime 的 provider/profile 配置,同时把工具自己的管理态保存在独立 tool home 下。
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
它不是旧 `setup` 小工具,也不是围绕单目录 `~/.codex` 组织全部状态的脚本集合。
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
## 产品工作方式
|
|
20
|
+
|
|
21
|
+
`codex-switch` 使用 dual-path model。
|
|
25
22
|
|
|
26
|
-
|
|
23
|
+
tool home:
|
|
27
24
|
|
|
28
25
|
```text
|
|
29
|
-
|
|
26
|
+
~/.config/codex-switch/
|
|
27
|
+
codex-switch.json
|
|
28
|
+
providers.json
|
|
29
|
+
backups/
|
|
30
|
+
runtime/
|
|
31
|
+
runtimes/
|
|
30
32
|
```
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
## 为什么要做这个产品
|
|
35
|
-
|
|
36
|
-
围绕 Codex 配置切换,当前常见方案通常有两个问题:
|
|
37
|
-
|
|
38
|
-
- 太轻
|
|
39
|
-
- 单个脚本可以完成基本切换,但不够产品化,不适合长期维护,也不适合让 AI 稳定调用
|
|
40
|
-
- 太重
|
|
41
|
-
- 一些方案偏桌面 GUI、偏多账号体系、偏代理层控制,不适合只想快速切换本地配置的场景
|
|
42
|
-
|
|
43
|
-
`codex-switch` 填补的是这两者之间的空缺:
|
|
44
|
-
|
|
45
|
-
- 比脚本更标准
|
|
46
|
-
- 比重型工具更轻
|
|
47
|
-
- 比手工改配置更安全
|
|
48
|
-
- 比临时命令更适合 AI 自动化调用
|
|
49
|
-
|
|
50
|
-
## 它解决什么问题
|
|
51
|
-
|
|
52
|
-
`codex-switch` 主要解决以下问题:
|
|
53
|
-
|
|
54
|
-
- 本机维护多个 provider / profile 时,切换过程繁琐
|
|
55
|
-
- 手动修改 `~/.codex/config.toml` 风险高,容易改错
|
|
56
|
-
- 切换后还需要同步处理登录状态或 API key
|
|
57
|
-
- 缺少统一命令去查看当前状态、导入导出配置、做基础诊断
|
|
58
|
-
- AI 代理难以稳定复用临时脚本或手工流程
|
|
59
|
-
|
|
60
|
-
简单说,它把原本零散、不稳定、容易出错的本地切换流程,收敛成一套可预期的产品接口。
|
|
61
|
-
|
|
62
|
-
## 目标用户
|
|
63
|
-
|
|
64
|
-
### 1. 个人开发者
|
|
65
|
-
|
|
66
|
-
这类用户会在同一台机器上使用多个 Codex provider 或多个 profile,希望快速切换,而不想反复手动编辑文件。
|
|
67
|
-
|
|
68
|
-
### 2. 高频切换用户
|
|
69
|
-
|
|
70
|
-
这类用户需要在不同 API key、不同环境配置、不同 provider 之间频繁切换,希望切换动作标准化。
|
|
71
|
-
|
|
72
|
-
### 3. AI 代理使用者
|
|
73
|
-
|
|
74
|
-
这类用户希望让 AI 直接执行:
|
|
75
|
-
|
|
76
|
-
- 查看当前配置
|
|
77
|
-
- 列出可用 provider
|
|
78
|
-
- 切换 provider
|
|
79
|
-
- 导入或导出配置
|
|
80
|
-
- 诊断当前环境
|
|
81
|
-
|
|
82
|
-
### 4. 重视配置安全的用户
|
|
83
|
-
|
|
84
|
-
这类用户不接受“切换失败后手动修配置”的流程,希望所有写操作都先备份,失败后能回滚。
|
|
85
|
-
|
|
86
|
-
## 产品形态
|
|
87
|
-
|
|
88
|
-
`codex-switch` 当前明确采用 CLI-first 形态。
|
|
89
|
-
|
|
90
|
-
这意味着:
|
|
91
|
-
|
|
92
|
-
- 第一阶段只提供命令行接口
|
|
93
|
-
- 所有核心功能都能通过命令完成
|
|
94
|
-
- 重点优化稳定命令、明确输出和自动化兼容性
|
|
95
|
-
- 不依赖 GUI,不依赖后台常驻服务
|
|
96
|
-
|
|
97
|
-
这也是它和一些桌面切换器最大的区别:`codex-switch` 更强调自动化与可调用性,而不是可视化操作界面。
|
|
98
|
-
|
|
99
|
-
## 核心价值
|
|
100
|
-
|
|
101
|
-
### 1. 切换更简单
|
|
102
|
-
|
|
103
|
-
用户不需要手动打开配置文件查找和修改 `profile`,只需要执行一条命令。
|
|
104
|
-
|
|
105
|
-
### 2. 修改更安全
|
|
106
|
-
|
|
107
|
-
所有关键写操作都围绕“先备份、后修改、失败回滚”的原则设计,降低误操作风险。
|
|
108
|
-
|
|
109
|
-
### 3. 对 AI 更友好
|
|
110
|
-
|
|
111
|
-
命令名、参数和输出结构保持稳定,AI 可以把它当成标准工具调用,而不是临时脚本。
|
|
112
|
-
|
|
113
|
-
### 4. 产品边界更清晰
|
|
114
|
-
|
|
115
|
-
它不试图一开始就处理账号全生命周期、可视化界面、复杂路由和远程同步,而是聚焦“本地 provider/profile 管理和切换”这一件事。
|
|
116
|
-
|
|
117
|
-
## 核心能力
|
|
118
|
-
|
|
119
|
-
MVP 的能力范围主要包括:
|
|
120
|
-
|
|
121
|
-
- provider/profile 管理
|
|
122
|
-
- 查看、添加、删除本地 provider 记录
|
|
123
|
-
- 当前状态查看
|
|
124
|
-
- 查看当前生效 profile
|
|
125
|
-
- 查看本地配置整体状态
|
|
126
|
-
- provider 切换
|
|
127
|
-
- 切换到指定 provider
|
|
128
|
-
- 默认联动执行 `codex login --with-api-key`
|
|
129
|
-
- 配置安全
|
|
130
|
-
- 修改前自动备份
|
|
131
|
-
- 失败时自动回滚
|
|
132
|
-
- 配置迁移
|
|
133
|
-
- 导入和导出 `providers.json`
|
|
134
|
-
- 环境诊断
|
|
135
|
-
- 检查配置文件、provider 映射和 CLI 可用性
|
|
136
|
-
|
|
137
|
-
## 产品工作方式
|
|
138
|
-
|
|
139
|
-
`codex-switch` 的工作对象主要围绕 `~/.codex/` 目录:
|
|
34
|
+
target Codex runtime:
|
|
140
35
|
|
|
141
36
|
```text
|
|
142
37
|
~/.codex/
|
|
143
38
|
config.toml
|
|
144
39
|
auth.json
|
|
145
|
-
providers.json
|
|
146
|
-
backups/
|
|
147
40
|
```
|
|
148
41
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- `config.toml` 是主配置文件
|
|
152
|
-
- `providers.json` 是 `codex-switch` 自身维护的 provider 清单
|
|
153
|
-
- `auth.json` 是当前 active direct provider 的认证投影文件;切换 direct provider 时会刷新 `OPENAI_API_KEY`
|
|
154
|
-
- `backups/` 用于保存历史备份
|
|
155
|
-
|
|
156
|
-
产品不会要求用户先理解全部内部实现,只暴露统一的命令接口。
|
|
157
|
-
|
|
158
|
-
## 典型使用流程
|
|
159
|
-
|
|
160
|
-
### 场景 1:查看当前状态
|
|
161
|
-
|
|
162
|
-
用户可以先查看当前生效 profile,以及本地配置是否完整。
|
|
163
|
-
|
|
164
|
-
### 场景 2:列出所有 provider
|
|
165
|
-
|
|
166
|
-
用户可以查看当前有哪些可切换 provider,以及它们分别映射到哪个 profile。
|
|
167
|
-
|
|
168
|
-
### 场景 3:切换到目标 provider
|
|
42
|
+
说明:
|
|
169
43
|
|
|
170
|
-
|
|
44
|
+
- `providers.json` 不位于 `~/.codex`
|
|
45
|
+
- `backups/` 不位于 `~/.codex`
|
|
46
|
+
- tool home 承担管理态 SSOT
|
|
47
|
+
- target runtime 承担受管运行态投影
|
|
171
48
|
|
|
172
|
-
|
|
49
|
+
## 核心使用流程
|
|
173
50
|
|
|
174
|
-
|
|
51
|
+
Direct 主路径:
|
|
175
52
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
- 有稳定命令集
|
|
185
|
-
- 有统一输出格式
|
|
186
|
-
- 有更清晰的产品边界
|
|
187
|
-
- 更适合长期维护
|
|
188
|
-
|
|
189
|
-
相较于 GUI 或重型账号工具,`codex-switch` 的区别在于:
|
|
190
|
-
|
|
191
|
-
- 更轻量
|
|
192
|
-
- 更适合自动化
|
|
193
|
-
- 更适合 AI 调用
|
|
194
|
-
- 聚焦本地 provider/profile,而不是扩展成完整账号平台
|
|
195
|
-
|
|
196
|
-
## 当前明确不做的内容
|
|
197
|
-
|
|
198
|
-
当前版本不做以下内容:
|
|
199
|
-
|
|
200
|
-
- GUI / Desktop App
|
|
201
|
-
- 常驻后台服务
|
|
202
|
-
- 代理转发层
|
|
203
|
-
- 复杂多账号体系
|
|
204
|
-
- 自动智能路由
|
|
205
|
-
- 远程同步
|
|
206
|
-
|
|
207
|
-
这些方向不是永远不做,而是不属于当前产品的首要问题。
|
|
208
|
-
|
|
209
|
-
## 为什么是 TypeScript / Node.js
|
|
210
|
-
|
|
211
|
-
`codex-switch` 当前优先选择 TypeScript / Node.js,不是因为这个产品需要高性能计算,而是因为这条路线更符合它的产品形态:
|
|
212
|
-
|
|
213
|
-
- npm 全局安装体验成熟
|
|
214
|
-
- CLI 生态完善
|
|
215
|
-
- 开发和迭代速度更快
|
|
216
|
-
- 更方便后续扩展交互、JSON 输出和 AI 集成
|
|
217
|
-
|
|
218
|
-
因此,当前阶段真正重要的不是“是否足够底层”,而是:
|
|
219
|
-
|
|
220
|
-
- 命令是否稳定
|
|
221
|
-
- 文件修改是否安全
|
|
222
|
-
- 输出是否易于解析
|
|
223
|
-
- 用户是否容易安装和使用
|
|
53
|
+
```bash
|
|
54
|
+
codexs init
|
|
55
|
+
codexs add <provider> --profile <name> --api-key <key>
|
|
56
|
+
codexs switch <provider>
|
|
57
|
+
codexs status
|
|
58
|
+
codexs doctor
|
|
59
|
+
```
|
|
224
60
|
|
|
225
|
-
|
|
61
|
+
Copilot 主路径:
|
|
226
62
|
|
|
227
|
-
|
|
63
|
+
```bash
|
|
64
|
+
codexs init
|
|
65
|
+
codexs login copilot
|
|
66
|
+
codexs add <provider> --copilot --profile <name>
|
|
67
|
+
codexs switch <provider>
|
|
68
|
+
codexs status
|
|
69
|
+
codexs doctor
|
|
70
|
+
```
|
|
228
71
|
|
|
229
|
-
|
|
230
|
-
- 用户可以可靠地查看、切换和管理本地 provider
|
|
231
|
-
- 切换失败时不会破坏本地配置
|
|
232
|
-
- AI 可以稳定调用关键命令
|
|
233
|
-
- 用户不需要再依赖手工改配置或维护零散脚本
|
|
72
|
+
Advanced adopt helper:
|
|
234
73
|
|
|
235
|
-
|
|
74
|
+
```bash
|
|
75
|
+
codexs init
|
|
76
|
+
codexs migrate
|
|
77
|
+
```
|
|
236
78
|
|
|
237
|
-
|
|
79
|
+
## 当前产品判断
|
|
238
80
|
|
|
239
|
-
|
|
81
|
+
`0.0.12` 的重点不是再加新命令,而是让用户在 README、help 和输出第一屏就能理解:
|
|
240
82
|
|
|
241
|
-
|
|
83
|
+
- fresh install 应先走什么
|
|
84
|
+
- Copilot 路径和 direct 路径有什么区别
|
|
85
|
+
- `migrate` 何时才该使用
|
|
86
|
+
- `status` / `doctor` 如何帮助定位下一步
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# codex-switch 技术架构设计
|
|
2
2
|
|
|
3
|
+
> 状态说明:这份文档是历史跨版本参考,不是当前 release contract。
|
|
4
|
+
> 当前事实源请改看 [`docs/cli-usage.md`](./cli-usage.md)、[`docs/PRD/codex-switch-prd-v0.0.12.md`](./PRD/codex-switch-prd-v0.0.12.md)、[`docs/Design/codex-switch-v0.0.12-design.md`](./Design/codex-switch-v0.0.12-design.md)。
|
|
5
|
+
|
|
3
6
|
## 文档信息
|
|
4
7
|
|
|
5
8
|
- 文档类型:技术架构设计文档
|
package/package.json
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rollbackLatest = rollbackLatest;
|
|
4
|
-
const errors_1 = require("../domain/errors");
|
|
5
|
-
const backup_repo_1 = require("../storage/backup-repo");
|
|
6
|
-
/**
|
|
7
|
-
* Restores the most recent mutation backup recorded by codex-switch.
|
|
8
|
-
*/
|
|
9
|
-
function rollbackLatest(latestBackupPath) {
|
|
10
|
-
const manifest = (0, backup_repo_1.loadLatestManifest)(latestBackupPath);
|
|
11
|
-
try {
|
|
12
|
-
(0, backup_repo_1.restoreManifest)(manifest);
|
|
13
|
-
return {
|
|
14
|
-
data: {
|
|
15
|
-
restoredFiles: manifest.files.map((file) => file.relativePath),
|
|
16
|
-
backupPath: manifest.backupDir,
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
catch (error) {
|
|
21
|
-
throw (0, errors_1.cliError)("ROLLBACK_FAILED", "Rollback failed.", {
|
|
22
|
-
cause: (0, errors_1.normalizeError)(error).message,
|
|
23
|
-
backupPath: manifest.backupDir,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
}
|