@minniexcode/codex-switch 0.1.1 → 0.1.2
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.CN.md +6 -4
- package/README.md +13 -4
- package/dist/app/add-provider.js +1 -0
- package/dist/app/bridge.js +2 -1
- package/dist/app/switch-provider.js +2 -1
- package/dist/commands/handlers.js +1 -0
- package/dist/domain/config.js +45 -1
- package/dist/domain/providers.js +1 -0
- package/dist/runtime/copilot-adapter.js +326 -70
- package/dist/runtime/copilot-bridge-worker.js +27 -2
- package/dist/runtime/copilot-bridge.js +192 -10
- package/dist/runtime/copilot-cli.js +7 -0
- package/dist/runtime/copilot-installer.js +59 -1
- package/dist/runtime/copilot-sdk-loader.js +4 -1
- package/docs/Design/codex-switch-v0.1.0-design.md +32 -152
- package/docs/Design/codex-switch-v0.1.1-design.md +15 -26
- package/docs/Design/codex-switch-v0.1.2-design.md +65 -0
- package/docs/PRD/codex-switch-prd-v0.1.0.md +65 -217
- package/docs/PRD/codex-switch-prd-v0.1.1.md +26 -0
- package/docs/PRD/codex-switch-prd-v0.1.2.md +41 -0
- package/docs/Tests/testing.md +1 -1
- package/docs/cli-usage.md +12 -4
- package/docs/codex-switch-command-design.md +1 -1
- package/docs/codex-switch-product-overview.md +7 -3
- package/docs/codex-switch-product-research.md +2 -2
- package/docs/codex-switch-technical-architecture.md +84 -1115
- package/package.json +1 -1
- package/docs/Design/codex-switch-copilot-integration-design.md +0 -517
- package/docs/Design/codex-switch-v0.0.10-design.md +0 -669
- package/docs/Design/codex-switch-v0.0.11-design.md +0 -824
- package/docs/Design/codex-switch-v0.0.12-design.md +0 -343
- package/docs/Design/codex-switch-v0.0.4-design.md +0 -874
- package/docs/Design/codex-switch-v0.0.5-design.md +0 -932
- package/docs/Design/codex-switch-v0.0.6-design.md +0 -708
- package/docs/Design/codex-switch-v0.0.7-design.md +0 -862
- package/docs/Design/codex-switch-v0.0.8-design.md +0 -132
- package/docs/Design/codex-switch-v0.0.9-design.md +0 -182
- package/docs/Design/codex-switch-v0.0.9-to-v0.0.12-roadmap.md +0 -413
- package/docs/PRD/codex-switch-prd-v0.0.10.md +0 -406
- package/docs/PRD/codex-switch-prd-v0.0.11.md +0 -577
- package/docs/PRD/codex-switch-prd-v0.0.12.md +0 -279
- package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +0 -446
- package/docs/PRD/codex-switch-prd-v0.0.8.md +0 -62
- package/docs/PRD/codex-switch-prd-v0.0.9.md +0 -166
- package/docs/PRD/codex-switch-prd.md +0 -650
- package/docs/Tests/test-report-0.0.5.md +0 -163
- package/docs/Tests/test-report-0.0.7.md +0 -118
- package/docs/Tests/testing-bridge-v0.0.9.md +0 -367
|
@@ -1,650 +0,0 @@
|
|
|
1
|
-
# codex-switch PRD
|
|
2
|
-
|
|
3
|
-
> 状态说明:
|
|
4
|
-
> 这份文档保留为 `0.0.x` / MVP 阶段的历史 PRD 基线。
|
|
5
|
-
> 从 `0.0.3` 继续走向 `0.1.0` 的目标规格,请参考 [`codex-switch-prd-v0.1.0.md`](./codex-switch-prd-v0.1.0.md)。
|
|
6
|
-
|
|
7
|
-
## 文档信息
|
|
8
|
-
|
|
9
|
-
- 状态:Historical Baseline
|
|
10
|
-
- 产品名:`codex-switch`
|
|
11
|
-
- CLI 命令名:`codexs`
|
|
12
|
-
- 版本范围:MVP / CLI First
|
|
13
|
-
- 文档定位:`0.0.x` / MVP 阶段历史 PRD
|
|
14
|
-
- 对应研究稿:[`../codex-switch-product-research.md`](../codex-switch-product-research.md)
|
|
15
|
-
- 对应技术架构:[`../codex-switch-technical-architecture.md`](../codex-switch-technical-architecture.md)
|
|
16
|
-
- 对应命令设计:[`../codex-switch-command-design.md`](../codex-switch-command-design.md)
|
|
17
|
-
|
|
18
|
-
## 一句话定义
|
|
19
|
-
|
|
20
|
-
`codex-switch` 是一个本地优先、默认安全、对 AI 友好的 CLI 工具,用于管理和切换本机 Codex 的 provider/profile 配置。
|
|
21
|
-
|
|
22
|
-
## 背景与目标
|
|
23
|
-
|
|
24
|
-
当前围绕 Codex 配置切换的现有方案主要有两类问题:
|
|
25
|
-
|
|
26
|
-
- 方案过轻
|
|
27
|
-
- 单个脚本虽然能完成切换,但不够产品化,不利于全局安装、统一调用和后续扩展
|
|
28
|
-
- 方案过重
|
|
29
|
-
- 偏桌面 GUI、偏完整账号系统、偏代理层接管,不适合只想管理本地 provider/profile 的用户
|
|
30
|
-
|
|
31
|
-
当前仓库中的 [`codex-provider-switch/README.md`](./codex-provider-switch/README.md) 已验证最小可行路径:
|
|
32
|
-
|
|
33
|
-
- 读取 `~/.codex/config.toml`
|
|
34
|
-
- 读取 `~/.codex/providers.json`
|
|
35
|
-
- 切换顶层 `profile`
|
|
36
|
-
- 通过 `codex login --with-api-key` 更新当前 API key
|
|
37
|
-
- 失败时回滚配置
|
|
38
|
-
|
|
39
|
-
`codex-switch` 的目标不是替代完整账号管理器,也不是第一阶段就做桌面应用,而是把这条最小路径产品化为一个可安装、可维护、可自动化调用的 CLI。
|
|
40
|
-
|
|
41
|
-
本 PRD 的目标是为实现阶段直接提供决策完整的规格,避免把关键接口、数据模型和失败语义留到编码阶段再讨论。
|
|
42
|
-
|
|
43
|
-
## 产品目标
|
|
44
|
-
|
|
45
|
-
MVP 需要同时满足以下目标:
|
|
46
|
-
|
|
47
|
-
- 用户可以通过统一 CLI 管理本地 provider/profile 配置
|
|
48
|
-
- AI 代理可以稳定调用固定命令完成查看、切换、导入、导出和诊断
|
|
49
|
-
- 所有修改 `~/.codex` 的动作都具备备份与失败回滚能力
|
|
50
|
-
- 核心能力在离线情况下可用,除 `codex login --with-api-key` 外不依赖远程服务
|
|
51
|
-
|
|
52
|
-
## 非目标
|
|
53
|
-
|
|
54
|
-
以下内容明确不进入 MVP:
|
|
55
|
-
|
|
56
|
-
- GUI / Desktop App
|
|
57
|
-
- 常驻后台服务
|
|
58
|
-
- 代理转发层
|
|
59
|
-
- 复杂账号系统
|
|
60
|
-
- 自动智能路由
|
|
61
|
-
- 远程同步
|
|
62
|
-
- 必须联网才能工作的核心主流程
|
|
63
|
-
|
|
64
|
-
## 目标用户
|
|
65
|
-
|
|
66
|
-
### 1. 个人多 provider 用户
|
|
67
|
-
|
|
68
|
-
这类用户在本机维护多个 API key、多个 profile 或多个上游服务,希望快速切换,不想手动编辑配置文件。
|
|
69
|
-
|
|
70
|
-
### 2. AI 代理操作者
|
|
71
|
-
|
|
72
|
-
这类用户希望让 AI 通过稳定命令直接执行查看、切换、导入和诊断,而不需要理解脚本实现细节。
|
|
73
|
-
|
|
74
|
-
### 3. 安全敏感用户
|
|
75
|
-
|
|
76
|
-
这类用户要求所有配置修改先备份,失败时自动回滚,并且敏感值不在终端输出中泄露。
|
|
77
|
-
|
|
78
|
-
## 典型场景
|
|
79
|
-
|
|
80
|
-
### 场景 1:首次导入 provider 清单
|
|
81
|
-
|
|
82
|
-
用户已经准备好一份 `providers.json`,希望通过命令导入到 `~/.codex` 下,并在导入前自动备份已有文件。
|
|
83
|
-
|
|
84
|
-
### 场景 2:日常切换 provider
|
|
85
|
-
|
|
86
|
-
用户需要在 `packycode` 和 `freemodel` 等 provider 之间切换,并希望自动完成 profile 切换和登录更新。
|
|
87
|
-
|
|
88
|
-
### 场景 3:切换失败后自动恢复
|
|
89
|
-
|
|
90
|
-
用户切换时遇到 `codex login` 失败,工具应自动回滚受影响文件,并明确提示恢复结果。
|
|
91
|
-
|
|
92
|
-
### 场景 4:AI 诊断本地状态
|
|
93
|
-
|
|
94
|
-
AI 需要通过 `status` 或 `doctor --json` 判断本地配置是否完整、当前 profile 是否可映射、切换是否具备前置条件。
|
|
95
|
-
|
|
96
|
-
## 核心原则
|
|
97
|
-
|
|
98
|
-
### CLI First
|
|
99
|
-
|
|
100
|
-
所有核心能力都必须通过命令完成,不依赖图形界面。
|
|
101
|
-
|
|
102
|
-
### AI Friendly
|
|
103
|
-
|
|
104
|
-
关键命令必须提供稳定、可解析的 `--json` 输出。
|
|
105
|
-
|
|
106
|
-
### Progressive For Humans
|
|
107
|
-
|
|
108
|
-
高频人类写命令可以在 TTY 中提供渐进式交互,但这层体验不能改变自动化的显式参数契约。
|
|
109
|
-
|
|
110
|
-
### Local First
|
|
111
|
-
|
|
112
|
-
MVP 的核心对象是本地文件与本机配置,不依赖云端控制面。
|
|
113
|
-
|
|
114
|
-
### Safe by Default
|
|
115
|
-
|
|
116
|
-
所有写操作都必须优先备份,并在失败时提供自动回滚。
|
|
117
|
-
|
|
118
|
-
## MVP 范围
|
|
119
|
-
|
|
120
|
-
MVP 只覆盖以下五类能力:
|
|
121
|
-
|
|
122
|
-
- provider/profile 管理
|
|
123
|
-
- provider 切换
|
|
124
|
-
- 备份与回滚
|
|
125
|
-
- 导入导出
|
|
126
|
-
- 状态诊断
|
|
127
|
-
|
|
128
|
-
## 文件与数据契约
|
|
129
|
-
|
|
130
|
-
### 目标目录
|
|
131
|
-
|
|
132
|
-
默认工作目录:
|
|
133
|
-
|
|
134
|
-
```text
|
|
135
|
-
~/.codex/
|
|
136
|
-
config.toml
|
|
137
|
-
auth.json
|
|
138
|
-
providers.json
|
|
139
|
-
backups/
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
工具默认操作 `~/.codex`,也允许通过 `--codex-dir <path>` 指向其他目录。
|
|
143
|
-
|
|
144
|
-
### `config.toml`
|
|
145
|
-
|
|
146
|
-
- 是 Codex 的主配置文件
|
|
147
|
-
- `codex-switch` 的 MVP 只要求读取与更新顶层 `profile`
|
|
148
|
-
- 工具不负责创建新的 `[profiles.<name>]`
|
|
149
|
-
|
|
150
|
-
### `providers.json`
|
|
151
|
-
|
|
152
|
-
- 是 `codex-switch` 的主数据文件
|
|
153
|
-
- 用于定义 provider 到 profile 和 key 的映射
|
|
154
|
-
- MVP 的导入、导出、增删改查均围绕该文件进行
|
|
155
|
-
|
|
156
|
-
### `auth.json`
|
|
157
|
-
|
|
158
|
-
- 不是 MVP 的主建模对象
|
|
159
|
-
- 如果文件存在,在 `switch` 过程中应被纳入备份与回滚范围
|
|
160
|
-
|
|
161
|
-
### `backups/`
|
|
162
|
-
|
|
163
|
-
- 用于保存切换前或写入前的备份文件
|
|
164
|
-
- 备份路径应在成功输出或错误提示中可见
|
|
165
|
-
|
|
166
|
-
## `providers.json` 数据模型
|
|
167
|
-
|
|
168
|
-
MVP 固定使用以下结构:
|
|
169
|
-
|
|
170
|
-
```json
|
|
171
|
-
{
|
|
172
|
-
"providers": {
|
|
173
|
-
"packycode": {
|
|
174
|
-
"profile": "packycode",
|
|
175
|
-
"apiKey": "sk-xxx",
|
|
176
|
-
"baseUrl": "https://example.com/v1",
|
|
177
|
-
"note": "primary free model route",
|
|
178
|
-
"tags": ["free", "daily"]
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### 字段定义
|
|
185
|
-
|
|
186
|
-
- `profile`
|
|
187
|
-
- 必填
|
|
188
|
-
- 对应 `config.toml` 中已经存在的 profile 名
|
|
189
|
-
- `apiKey`
|
|
190
|
-
- 必填
|
|
191
|
-
- 用于执行 `codex login --with-api-key`
|
|
192
|
-
- `baseUrl`
|
|
193
|
-
- 选填
|
|
194
|
-
- v1 允许存储在 `providers.json`,但不要求回写到 `config.toml`
|
|
195
|
-
- `note`
|
|
196
|
-
- 选填
|
|
197
|
-
- 面向人类和 AI 的说明字段
|
|
198
|
-
- `tags`
|
|
199
|
-
- 选填
|
|
200
|
-
- 字符串数组,为未来筛选和推荐预留
|
|
201
|
-
|
|
202
|
-
### 安全约束
|
|
203
|
-
|
|
204
|
-
- MVP 允许明文保存 `apiKey`
|
|
205
|
-
- 文档中必须明确 `providers.json` 是本地机密文件
|
|
206
|
-
- CLI 默认不得打印完整 `apiKey`
|
|
207
|
-
|
|
208
|
-
## 公共 CLI 接口
|
|
209
|
-
|
|
210
|
-
### 全局参数
|
|
211
|
-
|
|
212
|
-
所有支持的命令共享以下参数:
|
|
213
|
-
|
|
214
|
-
- `--json`
|
|
215
|
-
- 输出稳定 JSON
|
|
216
|
-
- `--codex-dir <path>`
|
|
217
|
-
- 指定工作目录,替代默认 `~/.codex`
|
|
218
|
-
|
|
219
|
-
### 命令清单
|
|
220
|
-
|
|
221
|
-
MVP 固定包含以下命令:
|
|
222
|
-
|
|
223
|
-
- `codexs list`
|
|
224
|
-
- `codexs current`
|
|
225
|
-
- `codexs switch <provider>`
|
|
226
|
-
- `codexs status`
|
|
227
|
-
- `codexs import <file>`
|
|
228
|
-
- `codexs export <file>`
|
|
229
|
-
- `codexs add <provider>`
|
|
230
|
-
- `codexs remove <provider>`
|
|
231
|
-
- `codexs doctor`
|
|
232
|
-
- `codexs rollback`
|
|
233
|
-
|
|
234
|
-
## 功能规格
|
|
235
|
-
|
|
236
|
-
### `codexs list`
|
|
237
|
-
|
|
238
|
-
用途:
|
|
239
|
-
|
|
240
|
-
- 列出 `providers.json` 中已配置的 provider
|
|
241
|
-
|
|
242
|
-
输入:
|
|
243
|
-
|
|
244
|
-
- 无必填位置参数
|
|
245
|
-
|
|
246
|
-
行为:
|
|
247
|
-
|
|
248
|
-
- 读取 `providers.json`
|
|
249
|
-
- 列出 provider 名称及其 `profile`
|
|
250
|
-
- 可附带展示 `note` 与 `tags`
|
|
251
|
-
|
|
252
|
-
成功输出:
|
|
253
|
-
|
|
254
|
-
- 人类模式:表格或列表
|
|
255
|
-
- JSON 模式:返回 provider 列表
|
|
256
|
-
|
|
257
|
-
失败行为:
|
|
258
|
-
|
|
259
|
-
- `providers.json` 不存在时报错
|
|
260
|
-
- JSON 解析失败时报错
|
|
261
|
-
|
|
262
|
-
### `codexs current`
|
|
263
|
-
|
|
264
|
-
用途:
|
|
265
|
-
|
|
266
|
-
- 读取当前生效的顶层 `profile`
|
|
267
|
-
|
|
268
|
-
行为:
|
|
269
|
-
|
|
270
|
-
- 读取 `config.toml`
|
|
271
|
-
- 返回当前顶层 `profile`
|
|
272
|
-
|
|
273
|
-
失败行为:
|
|
274
|
-
|
|
275
|
-
- `config.toml` 不存在时报错
|
|
276
|
-
- 无法解析时返回错误
|
|
277
|
-
|
|
278
|
-
### `codexs switch <provider>`
|
|
279
|
-
|
|
280
|
-
用途:
|
|
281
|
-
|
|
282
|
-
- 切换到指定 provider
|
|
283
|
-
|
|
284
|
-
参数:
|
|
285
|
-
|
|
286
|
-
- 位置参数:`<provider>`
|
|
287
|
-
- 可选参数:`--no-login`
|
|
288
|
-
|
|
289
|
-
交互边界:
|
|
290
|
-
|
|
291
|
-
- 当 `<provider>` 缺失且运行在 TTY 中时,允许用户从 provider 列表中选择
|
|
292
|
-
- `--json` 或非 TTY 场景下仍要求显式 provider
|
|
293
|
-
- 当 provider 已显式传入时,不做额外确认
|
|
294
|
-
|
|
295
|
-
前置校验:
|
|
296
|
-
|
|
297
|
-
- `providers.json` 存在且可解析
|
|
298
|
-
- 指定 provider 存在
|
|
299
|
-
- provider 对应 `profile` 在 `config.toml` 中存在
|
|
300
|
-
|
|
301
|
-
执行顺序:
|
|
302
|
-
|
|
303
|
-
1. 读取并校验输入文件
|
|
304
|
-
2. 备份 `config.toml`
|
|
305
|
-
3. 如果 `auth.json` 存在,一并备份
|
|
306
|
-
4. 更新 `config.toml` 顶层 `profile`
|
|
307
|
-
5. 默认执行 `codex login --with-api-key`
|
|
308
|
-
6. 如果任一步失败,回滚已修改文件
|
|
309
|
-
|
|
310
|
-
成功输出:
|
|
311
|
-
|
|
312
|
-
- 当前 provider
|
|
313
|
-
- 当前 profile
|
|
314
|
-
- 是否执行登录
|
|
315
|
-
- 备份路径
|
|
316
|
-
|
|
317
|
-
失败行为:
|
|
318
|
-
|
|
319
|
-
- provider 不存在时不修改任何文件
|
|
320
|
-
- profile 不存在时不修改任何文件
|
|
321
|
-
- `codex login` 失败时必须自动回滚
|
|
322
|
-
- 回滚成功与否必须显式提示
|
|
323
|
-
|
|
324
|
-
### `codexs status`
|
|
325
|
-
|
|
326
|
-
用途:
|
|
327
|
-
|
|
328
|
-
- 汇总当前状态,帮助用户和 AI 快速判断系统是否可切换
|
|
329
|
-
|
|
330
|
-
输出至少包含:
|
|
331
|
-
|
|
332
|
-
- 当前 profile
|
|
333
|
-
- `config.toml` 是否存在
|
|
334
|
-
- `providers.json` 是否存在
|
|
335
|
-
- 当前 profile 是否能映射到 provider
|
|
336
|
-
|
|
337
|
-
职责边界:
|
|
338
|
-
|
|
339
|
-
- `status` 只做状态概览,不做深度诊断建议
|
|
340
|
-
|
|
341
|
-
### `codexs import <file>`
|
|
342
|
-
|
|
343
|
-
用途:
|
|
344
|
-
|
|
345
|
-
- 从外部 JSON 文件导入 provider 配置
|
|
346
|
-
|
|
347
|
-
行为:
|
|
348
|
-
|
|
349
|
-
- 读取目标文件
|
|
350
|
-
- 校验顶层结构和必填字段
|
|
351
|
-
- 备份现有 `providers.json`
|
|
352
|
-
- 以“整体替换”方式写入新的 `providers.json`
|
|
353
|
-
|
|
354
|
-
失败行为:
|
|
355
|
-
|
|
356
|
-
- 非法 JSON 拒绝写入
|
|
357
|
-
- 缺少必填字段拒绝写入
|
|
358
|
-
- 写入失败时恢复旧文件
|
|
359
|
-
|
|
360
|
-
说明:
|
|
361
|
-
|
|
362
|
-
- MVP 不做 merge 导入,固定为整体替换
|
|
363
|
-
- 路径参数保持显式,不做路径向导
|
|
364
|
-
- TTY 中在真正覆盖前增加确认
|
|
365
|
-
|
|
366
|
-
### `codexs export <file>`
|
|
367
|
-
|
|
368
|
-
用途:
|
|
369
|
-
|
|
370
|
-
- 导出当前 `providers.json`
|
|
371
|
-
|
|
372
|
-
行为:
|
|
373
|
-
|
|
374
|
-
- 将当前配置写出到指定文件
|
|
375
|
-
|
|
376
|
-
规则:
|
|
377
|
-
|
|
378
|
-
- 默认不覆盖已有文件
|
|
379
|
-
- 只有传入 `--force` 时才允许覆盖
|
|
380
|
-
- TTY 中若目标已存在且未传 `--force`,允许通过确认覆盖
|
|
381
|
-
- 非 TTY 与 `--json` 保持显式 `--force` 契约
|
|
382
|
-
|
|
383
|
-
### `codexs add <provider>`
|
|
384
|
-
|
|
385
|
-
用途:
|
|
386
|
-
|
|
387
|
-
- 新增一个 provider 记录
|
|
388
|
-
|
|
389
|
-
参数:
|
|
390
|
-
|
|
391
|
-
- 位置参数:`<provider>`
|
|
392
|
-
- 必填参数:`--profile <name>`、`--api-key <key>`
|
|
393
|
-
- 选填参数:`--base-url <url>`、`--note <text>`、`--tag <tag>` 可重复
|
|
394
|
-
|
|
395
|
-
行为:
|
|
396
|
-
|
|
397
|
-
- 读取现有 `providers.json`
|
|
398
|
-
- 校验 provider 名未重复
|
|
399
|
-
- 备份旧文件
|
|
400
|
-
- 追加新记录并写回
|
|
401
|
-
|
|
402
|
-
范围限制:
|
|
403
|
-
|
|
404
|
-
- 显式参数模式仍是自动化主路径
|
|
405
|
-
- 当 `add` 缺少必填参数且运行在 TTY 中时,允许进入渐进式交互录入
|
|
406
|
-
- `--json` 或非 TTY 场景下仍要求显式传参
|
|
407
|
-
- `profile` 优先展示 `config.toml` 中现有 profile 供选择
|
|
408
|
-
- `apiKey` 以隐藏输入采集并要求二次确认
|
|
409
|
-
|
|
410
|
-
### `codexs remove <provider>`
|
|
411
|
-
|
|
412
|
-
用途:
|
|
413
|
-
|
|
414
|
-
- 删除一个 provider 记录
|
|
415
|
-
|
|
416
|
-
参数:
|
|
417
|
-
|
|
418
|
-
- 位置参数:`<provider>`
|
|
419
|
-
- 可选参数:`--force`
|
|
420
|
-
|
|
421
|
-
行为:
|
|
422
|
-
|
|
423
|
-
- 校验 provider 存在
|
|
424
|
-
- 默认安全模式,不在非显式确认下直接删除
|
|
425
|
-
- 备份旧 `providers.json`
|
|
426
|
-
- 删除目标记录并写回
|
|
427
|
-
|
|
428
|
-
范围限制:
|
|
429
|
-
|
|
430
|
-
- TTY 中可选择 provider,并通过确认代替 `--force`
|
|
431
|
-
- 自动化调用场景下,仍要求显式传 `--force`
|
|
432
|
-
|
|
433
|
-
### `codexs doctor`
|
|
434
|
-
|
|
435
|
-
用途:
|
|
436
|
-
|
|
437
|
-
- 做基础诊断并返回可操作的问题列表
|
|
438
|
-
|
|
439
|
-
诊断项至少包含:
|
|
440
|
-
|
|
441
|
-
- `config.toml` 是否存在
|
|
442
|
-
- `providers.json` 是否存在
|
|
443
|
-
- `providers.json` 是否可解析
|
|
444
|
-
- provider 对应 `profile` 是否存在
|
|
445
|
-
- `codex` CLI 是否可执行
|
|
446
|
-
|
|
447
|
-
职责边界:
|
|
448
|
-
|
|
449
|
-
- `doctor` 面向问题检测与诊断
|
|
450
|
-
- 相比 `status`,它应返回更明确的问题项
|
|
451
|
-
|
|
452
|
-
### `codexs rollback`
|
|
453
|
-
|
|
454
|
-
用途:
|
|
455
|
-
|
|
456
|
-
- 从最近一次备份恢复受影响配置
|
|
457
|
-
|
|
458
|
-
行为:
|
|
459
|
-
|
|
460
|
-
- 查找最近一次可用备份
|
|
461
|
-
- 恢复 `config.toml`
|
|
462
|
-
- 如果对应备份存在 `auth.json`,一并恢复
|
|
463
|
-
|
|
464
|
-
说明:
|
|
465
|
-
|
|
466
|
-
- `rollback` 进入 MVP,因为它直接支撑“默认安全”的产品承诺
|
|
467
|
-
- TTY 中在恢复前展示将被恢复的文件摘要,并请求确认
|
|
468
|
-
|
|
469
|
-
## 输出契约
|
|
470
|
-
|
|
471
|
-
### 默认输出
|
|
472
|
-
|
|
473
|
-
- 面向人类可读
|
|
474
|
-
- 简洁、稳定
|
|
475
|
-
- 不输出无关噪音
|
|
476
|
-
- 不打印完整敏感值
|
|
477
|
-
|
|
478
|
-
### JSON 输出结构
|
|
479
|
-
|
|
480
|
-
所有支持 `--json` 的关键命令使用统一结构:
|
|
481
|
-
|
|
482
|
-
```json
|
|
483
|
-
{
|
|
484
|
-
"ok": true,
|
|
485
|
-
"command": "switch",
|
|
486
|
-
"data": {
|
|
487
|
-
"provider": "packycode",
|
|
488
|
-
"profile": "packycode",
|
|
489
|
-
"backupPath": "C:\\Users\\name\\.codex\\backups\\config-20260511-120000.toml"
|
|
490
|
-
},
|
|
491
|
-
"warnings": [],
|
|
492
|
-
"error": null
|
|
493
|
-
}
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
字段定义:
|
|
497
|
-
|
|
498
|
-
- `ok`
|
|
499
|
-
- 是否成功
|
|
500
|
-
- `command`
|
|
501
|
-
- 当前命令名
|
|
502
|
-
- `data`
|
|
503
|
-
- 命令输出主体
|
|
504
|
-
- `warnings`
|
|
505
|
-
- 非致命警告数组
|
|
506
|
-
- `error`
|
|
507
|
-
- 失败时返回对象,成功时为 `null`
|
|
508
|
-
|
|
509
|
-
## 错误处理与错误码
|
|
510
|
-
|
|
511
|
-
所有关键失败路径都要返回固定错误码,便于 AI 稳定判断。
|
|
512
|
-
|
|
513
|
-
MVP 固定错误码:
|
|
514
|
-
|
|
515
|
-
- `CONFIG_NOT_FOUND`
|
|
516
|
-
- `PROVIDERS_NOT_FOUND`
|
|
517
|
-
- `PROVIDERS_PARSE_ERROR`
|
|
518
|
-
- `PROVIDER_NOT_FOUND`
|
|
519
|
-
- `PROFILE_NOT_FOUND`
|
|
520
|
-
- `BACKUP_FAILED`
|
|
521
|
-
- `CODEX_LOGIN_FAILED`
|
|
522
|
-
- `ROLLBACK_FAILED`
|
|
523
|
-
- `INVALID_IMPORT_FILE`
|
|
524
|
-
|
|
525
|
-
错误处理原则:
|
|
526
|
-
|
|
527
|
-
- 文件不存在时给出明确路径
|
|
528
|
-
- JSON / TOML 解析失败时给出明确文件名
|
|
529
|
-
- provider 不存在时列出可选 provider
|
|
530
|
-
- profile 不存在时明确指出目标 profile 缺失
|
|
531
|
-
- `codex login` 失败时保留失败原因
|
|
532
|
-
- 自动回滚成功时必须明确提示
|
|
533
|
-
- 自动回滚失败时必须单独返回 `ROLLBACK_FAILED`
|
|
534
|
-
|
|
535
|
-
## 安全要求
|
|
536
|
-
|
|
537
|
-
### 敏感信息处理
|
|
538
|
-
|
|
539
|
-
- 不在默认输出中打印完整 `apiKey`
|
|
540
|
-
- 导出日志和报错信息中必须避免泄露完整密钥
|
|
541
|
-
- `providers.json` 应在文档中被标注为本地机密文件
|
|
542
|
-
|
|
543
|
-
### 文件写入安全
|
|
544
|
-
|
|
545
|
-
- 所有写操作先备份
|
|
546
|
-
- 所有路径操作应尽量显式
|
|
547
|
-
- 默认只操作用户指定或默认的 `~/.codex`
|
|
548
|
-
|
|
549
|
-
## 安装与发布
|
|
550
|
-
|
|
551
|
-
### 技术路线
|
|
552
|
-
|
|
553
|
-
- Node.js
|
|
554
|
-
- TypeScript
|
|
555
|
-
|
|
556
|
-
### 分发方式
|
|
557
|
-
|
|
558
|
-
- 主路径:npm 全局安装
|
|
559
|
-
- 辅助路径:`npx`
|
|
560
|
-
|
|
561
|
-
### 技术选择结论
|
|
562
|
-
|
|
563
|
-
当前阶段优先 TypeScript / Node.js,原因不是性能,而是:
|
|
564
|
-
|
|
565
|
-
- npm 分发成熟
|
|
566
|
-
- CLI 生态成熟
|
|
567
|
-
- 开发与迭代速度更快
|
|
568
|
-
- 更适合 AI 调用与后续能力扩展
|
|
569
|
-
|
|
570
|
-
Rust / Zig 不排除未来使用,但不属于 MVP 的必要条件。
|
|
571
|
-
|
|
572
|
-
## 兼容性要求
|
|
573
|
-
|
|
574
|
-
- 支持 Windows、macOS、Linux
|
|
575
|
-
- 路径处理需兼容不同平台
|
|
576
|
-
- 不依赖 GUI 环境
|
|
577
|
-
- 不要求目标机器具备额外桌面运行时
|
|
578
|
-
|
|
579
|
-
## 成功标准
|
|
580
|
-
|
|
581
|
-
满足以下条件即可视为 MVP 达成:
|
|
582
|
-
|
|
583
|
-
- 用户可以全局安装 `codex-switch`
|
|
584
|
-
- 用户可以通过 `codexs list` 查看本地 provider
|
|
585
|
-
- 用户可以通过 `codexs current` 查看当前 profile
|
|
586
|
-
- 用户可以通过 `codexs switch <provider>` 成功切换
|
|
587
|
-
- 切换失败时会自动回滚
|
|
588
|
-
- 用户可以导入和导出 `providers.json`
|
|
589
|
-
- `doctor` 能发现常见配置问题
|
|
590
|
-
- AI 可以稳定调用关键命令并解析 `--json` 输出
|
|
591
|
-
|
|
592
|
-
## 验收测试场景
|
|
593
|
-
|
|
594
|
-
### 安装与入口
|
|
595
|
-
|
|
596
|
-
- npm 全局安装后可直接执行 `codexs`
|
|
597
|
-
- `npx` 可执行基础只读命令
|
|
598
|
-
|
|
599
|
-
### 读取与列出
|
|
600
|
-
|
|
601
|
-
- `list` 在正常配置下返回完整 provider 列表
|
|
602
|
-
- `list` 在 `providers.json` 缺失时返回 `PROVIDERS_NOT_FOUND`
|
|
603
|
-
- `list` 在 JSON 损坏时返回 `PROVIDERS_PARSE_ERROR`
|
|
604
|
-
- `current` 在正常配置下返回顶层 `profile`
|
|
605
|
-
|
|
606
|
-
### 切换与回滚
|
|
607
|
-
|
|
608
|
-
- `switch` 成功时更新顶层 `profile` 并完成登录
|
|
609
|
-
- provider 不存在时返回 `PROVIDER_NOT_FOUND` 且不改文件
|
|
610
|
-
- profile 不存在时返回 `PROFILE_NOT_FOUND` 且不改文件
|
|
611
|
-
- `codex login` 失败时返回 `CODEX_LOGIN_FAILED` 并恢复备份
|
|
612
|
-
- 回滚失败时返回 `ROLLBACK_FAILED`
|
|
613
|
-
|
|
614
|
-
### 导入导出
|
|
615
|
-
|
|
616
|
-
- 导入合法文件时成功替换当前 `providers.json`
|
|
617
|
-
- 导入非法 JSON 时返回 `INVALID_IMPORT_FILE`
|
|
618
|
-
- 缺少必填字段时返回 `INVALID_IMPORT_FILE`
|
|
619
|
-
- 导出默认不覆盖已有文件
|
|
620
|
-
- 传入 `--force` 后允许覆盖
|
|
621
|
-
|
|
622
|
-
### 诊断
|
|
623
|
-
|
|
624
|
-
- `status` 返回当前 profile、文件存在性和映射状态
|
|
625
|
-
- `doctor` 能识别文件缺失、JSON 解析失败、profile 缺失和 `codex` CLI 缺失
|
|
626
|
-
|
|
627
|
-
### AI 调用稳定性
|
|
628
|
-
|
|
629
|
-
- `list`、`current`、`status`、`switch`、`doctor` 支持 `--json`
|
|
630
|
-
- 所有 JSON 输出字段结构一致
|
|
631
|
-
- 所有关键错误返回固定错误码
|
|
632
|
-
|
|
633
|
-
## 延后事项
|
|
634
|
-
|
|
635
|
-
以下内容不进入本次 PRD 的实现范围,但可以作为后续版本候选:
|
|
636
|
-
|
|
637
|
-
- provider 推荐
|
|
638
|
-
- 自动切换策略
|
|
639
|
-
- 使用情况统计
|
|
640
|
-
- 多设备同步
|
|
641
|
-
- GUI 版本
|
|
642
|
-
- 单文件原生二进制分发
|
|
643
|
-
|
|
644
|
-
## 当前结论
|
|
645
|
-
|
|
646
|
-
`codex-switch` 的正式产品定义应收敛为:
|
|
647
|
-
|
|
648
|
-
> 一个 CLI-first、本地优先、默认安全、对 AI 友好的 Codex provider/profile 切换工具。
|
|
649
|
-
|
|
650
|
-
它的 MVP 不追求完整账号体系,也不追求桌面化体验,而是优先把命令接口、配置安全、备份回滚和自动化调用能力做稳。
|