@minniexcode/codex-switch 0.1.0 → 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.
Files changed (68) hide show
  1. package/README.AI.md +141 -110
  2. package/README.CN.md +215 -179
  3. package/README.md +224 -183
  4. package/dist/app/add-provider.js +16 -23
  5. package/dist/app/bridge.js +2 -1
  6. package/dist/app/edit-provider.js +30 -65
  7. package/dist/app/get-current-profile.js +15 -3
  8. package/dist/app/get-status.js +11 -8
  9. package/dist/app/list-config-profiles.js +3 -1
  10. package/dist/app/list-providers.js +10 -4
  11. package/dist/app/remove-provider.js +52 -19
  12. package/dist/app/run-doctor.js +26 -29
  13. package/dist/app/setup-codex.js +3 -3
  14. package/dist/app/show-config.js +3 -1
  15. package/dist/app/switch-provider.js +38 -6
  16. package/dist/cli/output.js +29 -19
  17. package/dist/commands/handlers.js +3 -2
  18. package/dist/commands/help.js +3 -3
  19. package/dist/commands/registry.js +29 -29
  20. package/dist/domain/config.js +293 -209
  21. package/dist/domain/providers.js +8 -0
  22. package/dist/domain/runtime-state.js +15 -15
  23. package/dist/domain/setup.js +3 -1
  24. package/dist/interaction/interactive.js +2 -2
  25. package/dist/runtime/codex-version.js +7 -0
  26. package/dist/runtime/copilot-adapter.js +326 -70
  27. package/dist/runtime/copilot-bridge-worker.js +27 -2
  28. package/dist/runtime/copilot-bridge.js +192 -10
  29. package/dist/runtime/copilot-cli.js +7 -0
  30. package/dist/runtime/copilot-installer.js +59 -1
  31. package/dist/runtime/copilot-sdk-loader.js +4 -1
  32. package/dist/storage/config-repo.js +6 -14
  33. package/docs/Design/codex-switch-v0.1.0-design.md +32 -152
  34. package/docs/Design/codex-switch-v0.1.1-design.md +22 -0
  35. package/docs/Design/codex-switch-v0.1.2-design.md +65 -0
  36. package/docs/PRD/codex-switch-prd-v0.1.0.md +65 -217
  37. package/docs/PRD/codex-switch-prd-v0.1.1.md +26 -0
  38. package/docs/PRD/codex-switch-prd-v0.1.2.md +41 -0
  39. package/docs/Reference/codex-config-reference.md +41 -0
  40. package/docs/Reference/codex-config-reference.zh-CN.md +41 -0
  41. package/docs/Tests/testing.md +1 -1
  42. package/docs/cli-usage.md +290 -223
  43. package/docs/codex-switch-command-design.md +2 -2
  44. package/docs/codex-switch-product-overview.md +18 -13
  45. package/docs/codex-switch-product-research.md +2 -2
  46. package/docs/codex-switch-technical-architecture.md +84 -1115
  47. package/package.json +2 -2
  48. package/docs/Design/codex-switch-copilot-integration-design.md +0 -517
  49. package/docs/Design/codex-switch-v0.0.10-design.md +0 -669
  50. package/docs/Design/codex-switch-v0.0.11-design.md +0 -824
  51. package/docs/Design/codex-switch-v0.0.12-design.md +0 -343
  52. package/docs/Design/codex-switch-v0.0.4-design.md +0 -874
  53. package/docs/Design/codex-switch-v0.0.5-design.md +0 -932
  54. package/docs/Design/codex-switch-v0.0.6-design.md +0 -708
  55. package/docs/Design/codex-switch-v0.0.7-design.md +0 -862
  56. package/docs/Design/codex-switch-v0.0.8-design.md +0 -132
  57. package/docs/Design/codex-switch-v0.0.9-design.md +0 -182
  58. package/docs/Design/codex-switch-v0.0.9-to-v0.0.12-roadmap.md +0 -413
  59. package/docs/PRD/codex-switch-prd-v0.0.10.md +0 -406
  60. package/docs/PRD/codex-switch-prd-v0.0.11.md +0 -577
  61. package/docs/PRD/codex-switch-prd-v0.0.12.md +0 -279
  62. package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +0 -446
  63. package/docs/PRD/codex-switch-prd-v0.0.8.md +0 -62
  64. package/docs/PRD/codex-switch-prd-v0.0.9.md +0 -166
  65. package/docs/PRD/codex-switch-prd.md +0 -650
  66. package/docs/Tests/test-report-0.0.5.md +0 -163
  67. package/docs/Tests/test-report-0.0.7.md +0 -118
  68. package/docs/Tests/testing-bridge-v0.0.9.md +0 -367
@@ -1,577 +0,0 @@
1
- # codex-switch `0.0.11` PRD
2
-
3
- ## 文档信息
4
-
5
- - 状态:Active PRD
6
- - 产品名:`codex-switch`
7
- - CLI 命令名:`codexs`
8
- - 当前基线版本:`0.0.10`
9
- - 目标版本:`0.0.11`
10
- - 文档定位:定义 `0.0.10 -> 0.0.11` 的直接需求范围
11
- - 关联 roadmap:[`../Design/codex-switch-v0.0.9-to-v0.0.12-roadmap.md`](../Design/codex-switch-v0.0.9-to-v0.0.12-roadmap.md)
12
- - 关联上一版 PRD:[`./codex-switch-prd-v0.0.10.md`](./codex-switch-prd-v0.0.10.md)
13
-
14
- ## 一句话定义
15
-
16
- `0.0.11` 把 `codex-switch` 从“依附在某个 Codex 目录中的 provider 管理工具”升级为“拥有独立管理态 home、并开始抽象 upstream login 的本地 provider/router 管理器”。
17
-
18
- ## 版本定位
19
-
20
- `0.0.11` 不是只补一个 `login` 命令,也不是只把几个路径改掉。
21
-
22
- 它是一次结构性版本,目标是把 `codex-switch` 自己的管理态存储正式从 `~/.codex` 的语义里拆出来,形成稳定的工具级 home 边界,同时把上游登录从 `add --copilot` 中抽离为独立命令面。
23
-
24
- 本版要解决的不是单个实现细节,而是以下几个长期模型问题:
25
-
26
- - `providers.json` 和 `backups/` 仍绑在 `codexDir` 下,混淆了“工具状态”和“目标 Codex runtime 状态”
27
- - Copilot runtime install / runtime state 已经部分落在 `~/.codex-switch`,但 registry 仍在 `~/.codex`,边界不一致
28
- - `add --copilot` 同时承担 install、auth check、login 引导和 provider 写入,职责过重
29
- - 如果未来扩展更多 upstream 或 CLI/runtime,继续把工具管理态塞进 `codexDir` 会让模型持续恶化
30
-
31
- ## 产品定义
32
-
33
- ### 核心定义
34
-
35
- `0.0.11` 将 `codex-switch` 定位为:
36
-
37
- - 有独立 tool home 的本地 provider 管理器
38
- - 面向目标 Codex runtime 投影配置的工具
39
- - 可扩展到多 upstream 的登录与 runtime 编排入口
40
-
41
- ### 本版目标
42
-
43
- - 固定 `codex-switch` 独立 home 目录结构
44
- - 将管理态文件与目标 Codex runtime 文件彻底分层
45
- - 把上游登录抽成独立命令 `codexs login <upstream>`
46
- - 为未来多 upstream / 多 CLI 生态扩展预留稳定边界
47
- - 本版只真实落地 Copilot upstream
48
-
49
- ## In Scope
50
-
51
- - 新增默认 home:Windows 使用 `~/.config/codex-switch`
52
- - 新增最小工具级配置文件:`codex-switch.json`
53
- - 将 `providers.json`、`backups/`、lock 文件迁移到新 home
54
- - 将 Copilot runtime install 与 runtime state 明确纳入新 home 结构
55
- - 新增 `codexs login <upstream>`,首版支持 `copilot`
56
- - 支持 `github-copilot` 作为 `copilot` 的别名
57
- - 调整 `add --copilot` 语义,移除其内置安装 / 登录主流程
58
- - 同步更新帮助、文档、错误语义和测试
59
-
60
- ## Out of Scope
61
-
62
- - 一次性落地 Gemini / DeepSeek / 其他 upstream 的真实 runtime 或登录流程
63
- - 新增 `logout`
64
- - 新增完整 `auth` 子命令族
65
- - 将 `config.toml` / `auth.json` 从目标 Codex 目录迁出
66
- - 通用 package manager / plugin manager 能力
67
- - 多 workspace / 多 profile 的复杂工具级策略编辑器
68
- - GUI / daemon / 后台服务化
69
-
70
- ## 当前版本问题
71
-
72
- ### 1. 工具管理态与目标 runtime 状态混放
73
-
74
- 当前模型下,`providers.json`、`backups/`、lock 仍默认跟随 `codexDir`。这在语义上暗示这些文件属于某个单独 Codex runtime,但实际上它们描述的是 `codex-switch` 自己的受管状态。
75
-
76
- ### 2. Copilot runtime 相关文件边界不一致
77
-
78
- Copilot SDK install 和 bridge runtime state 已经逐步落到 `~/.codex-switch` 一类工具目录,但 provider registry 仍留在目标 `codexDir` 下,导致:
79
-
80
- - 同一类管理态文件散落两处
81
- - 备份与恢复边界难以解释
82
- - 文档和用户心智模型不断漂移
83
-
84
- ### 3. `add --copilot` 职责过载
85
-
86
- 当前 Copilot onboarding 流程中,`add --copilot` 可能承担:
87
-
88
- - SDK 是否存在的判断
89
- - SDK 安装
90
- - auth readiness 检查
91
- - 官方登录引导
92
- - provider registry 写入
93
-
94
- 这导致一个“provider mutation”命令承担了不属于 registry mutation 的上游登录编排责任。
95
-
96
- ### 4. 缺少稳定的工具级配置层
97
-
98
- 当前缺少一个明确的工具级配置文件来记录:
99
-
100
- - 默认目标 Codex 目录
101
- - tool home 级别的稳定元数据
102
-
103
- 结果是默认 Codex 目录解析只能依赖 CLI 参数、环境变量和硬编码回退,缺少正式的工具配置入口。
104
-
105
- ## 设计原则
106
-
107
- `0.0.11` 必须遵循以下原则:
108
-
109
- 1. 工具管理态与目标 runtime 状态严格分层。
110
- 2. `providers.json` 是 `codex-switch` tool home 内的管理态 SSOT,不再属于任何单个 `codexDir`。
111
- 3. `config.toml` 与 `auth.json` 继续属于目标 Codex runtime,不承载 `codex-switch` 的 registry 或 backup。
112
- 4. 上游登录是 onboarding / auth 能力,不是 provider mutation 能力。
113
- 5. 当前开发阶段优先最小实现,不为一次性历史状态引入自动迁移或长期兼容层。
114
- 6. 本版只落地 Copilot,但命令与目录模型必须为未来更多 upstream 留出扩展位。
115
-
116
- ## 存储模型
117
-
118
- ### 默认 tool home
119
-
120
- `0.0.11` 固定 `codex-switch` tool home 默认路径:
121
-
122
- - Windows:`~/.config/codex-switch`
123
-
124
- 本版不继续沿用 `~/.codex-switch` 作为主 home。本版不要求自动迁移旧 home 中的 runtime/state。
125
-
126
- ### tool home 目录职责
127
-
128
- `0.0.11` 固定以下目录与文件职责:
129
-
130
- - `codex-switch.json`
131
- - 工具级配置文件
132
- - `providers.json`
133
- - 管理态 provider registry SSOT
134
- - `backups/`
135
- - managed mutation backups
136
- - `runtime/`
137
- - runtime state,例如 `copilot-bridge-state.json`
138
- - `runtimes/`
139
- - 上游 runtime 安装目录,例如 Copilot SDK
140
- - `.lock` 或等价 lock 文件
141
- - `codex-switch` 写操作锁
142
-
143
- ### 目标 Codex 目录职责
144
-
145
- 目标 `codexDir` 继续只承担目标 Codex runtime 文件:
146
-
147
- - `config.toml`
148
- - `auth.json`
149
-
150
- ### 明确删除的旧语义
151
-
152
- 本版明确删除以下旧叙述:
153
-
154
- - `providers.json` 属于目标 Codex 目录
155
- - `backups/` 属于目标 Codex 目录
156
- - `codex-switch` 的 lock 文件属于目标 Codex 目录
157
- - `config.toml` / `auth.json` 承载 `codex-switch` registry 或 backups
158
-
159
- ## Tool Config Contract
160
-
161
- ### 配置文件
162
-
163
- 新增工具级配置文件:
164
-
165
- - `codex-switch.json`
166
-
167
- ### 本版最小稳定字段
168
-
169
- `0.0.11` 只固定最小稳定字段:
170
-
171
- - `version`
172
- - `defaultCodexDir`
173
-
174
- ### 字段语义
175
-
176
- - `version`
177
- - 记录工具配置文件格式或写入版本元信息
178
- - `defaultCodexDir`
179
- - 用于未显式传 `--codex-dir` 时,决定默认目标 Codex 目录
180
-
181
- ### `defaultCodexDir` 写入策略
182
-
183
- 本版固定:
184
-
185
- - 只有当次命令显式传入 `--codex-dir` 时,`init` 才允许写入 `defaultCodexDir`
186
- - 写入值仅限于用户显式传入的 `--codex-dir`
187
- - 若配置文件已存在,则 `init` 不覆盖已有 `defaultCodexDir`
188
- - 若当次 `codexDir` 来自环境变量、已有 config、开发 sandbox 或 `~/.codex` fallback,则 `init` 不写入 `defaultCodexDir`
189
- - 本版不引入单独的默认目录设置命令
190
-
191
- ### 默认目标 Codex 目录解析优先级
192
-
193
- 本版固定 CLI 解析优先级为:
194
-
195
- 1. `--codex-dir`
196
- 2. 环境变量 `CODEXS_CODEX_DIR`
197
- 3. `codex-switch.json.defaultCodexDir`
198
- 4. 开发环境默认 sandbox
199
- 5. `~/.codex`
200
-
201
- ### CLI 启动解析顺序
202
-
203
- 本版同时固定命令启动顺序:
204
-
205
- 1. 解析 CLI 参数与 flags
206
- 2. 先 resolve tool home
207
- 3. 读取并校验 `codex-switch.json`
208
- 4. 再按既定优先级 resolve `codexDir`
209
- 5. 构造完整 `CodexPaths`
210
- 6. 命令逻辑只消费已解析完成的 paths
211
-
212
- ### 本版明确不做的事
213
-
214
- - 不在 `codex-switch.json` 中引入 per-upstream 复杂策略
215
- - 不在 `codex-switch.json` 中引入 per-workspace / per-provider 规则
216
- - 不把 provider registry 塞回 `codex-switch.json`
217
-
218
- ## CLI Changes
219
-
220
- ### 新增命令
221
-
222
- 新增命令:
223
-
224
- - `codexs login <upstream>`
225
-
226
- ### v1 upstream 词汇
227
-
228
- 首版支持:
229
-
230
- - `copilot`
231
-
232
- 可接受别名:
233
-
234
- - `github-copilot`
235
-
236
- 内部二者归一为同一 upstream id。
237
-
238
- ### `login` 命令定位
239
-
240
- `login` 是 upstream auth / onboarding 命令,不是 provider mutation 命令。
241
-
242
- 因此它:
243
-
244
- - 不写入 `providers.json`
245
- - 不直接改写 `config.toml`
246
- - 不直接改写 `auth.json`
247
- - 不创建或删除 provider
248
-
249
- ### `login copilot` 行为
250
-
251
- `login copilot` 的主流程固定为:
252
-
253
- 1. 仅支持 TTY
254
- 2. 检查本地 Copilot SDK runtime 是否已安装
255
- 3. 缺失时询问是否立即安装 SDK
256
- 4. SDK 就绪后检查 auth readiness
257
- 5. 若已登录,则直接返回成功,不重复启动官方登录
258
- 6. 若未登录,则检查系统级官方 `copilot` CLI 是否可用
259
- 7. CLI 可用时启动官方 `copilot login`
260
- 8. 登录返回后执行一次显式 recheck
261
- 9. recheck 成功则完成;失败则返回明确错误与下一步提示
262
-
263
- ### SDK 与官方 CLI 的职责分离
264
-
265
- 本版固定以下模型:
266
-
267
- - tool home 本地安装物是 `@github/copilot-sdk`
268
- - `codex-switch` 只负责安装和探测本地 SDK
269
- - 官方 `copilot` CLI 不由 `codex-switch` 安装
270
- - `login copilot` 的真实登录动作只通过系统级 `copilot login` 完成
271
- - 若系统中没有可用的 `copilot` CLI,则命令失败并提示用户自行安装官方 CLI
272
-
273
- ### `add --copilot` 新语义
274
-
275
- `0.0.11` 后,`add --copilot` 只负责:
276
-
277
- - 创建 Copilot provider
278
- - 验证必要 runtime / auth 前提已满足
279
- - 在满足前提时写入 provider registry
280
-
281
- 它不再负责:
282
-
283
- - 安装 Copilot SDK
284
- - 启动官方 Copilot login
285
- - 用交互方式编排安装与登录全流程
286
-
287
- ### `add --copilot` 失败语义
288
-
289
- 当缺少前提时:
290
-
291
- - 缺 runtime:
292
- - 返回 `COPILOT_SDK_MISSING`
293
- - 提示执行 `codexs login copilot`
294
- - 缺 auth:
295
- - 返回 `COPILOT_AUTH_REQUIRED`
296
- - 提示执行 `codexs login copilot`
297
-
298
- ### `--install-copilot-sdk`
299
-
300
- 本版目标是让安装主流程从 `add --copilot` 中退出。因此:
301
-
302
- - `add --copilot --install-copilot-sdk` 不再执行 SDK 安装
303
- - 该 flag 保留为兼容输入壳层,但命令必须直接失败
304
- - 失败时明确提示改用 `codexs login copilot`
305
- - 文档和帮助文案必须把用户引导到 `codexs login copilot`
306
-
307
- ## `init` 语义调整
308
-
309
- ### 新语义
310
-
311
- `init` 不再以“创建 `codexDir/providers.json`”为核心。
312
-
313
- 它应转为:
314
-
315
- - 确保 tool home 已初始化
316
- - 确保 `codex-switch.json` 与 `providers.json` 的最小存在性
317
-
318
- ### 结果语义
319
-
320
- `init` 的成功结果应能解释:
321
-
322
- - tool home 是否新建
323
- - tool config 是否新建
324
- - provider registry 是否新建
325
-
326
- ## 路径与架构变化
327
-
328
- ### 双路径模型
329
-
330
- `createCodexPaths` 需要从“所有路径都由 `codexDir` 派生”的模型,重构为:
331
-
332
- - tool home 路径
333
- - 目标 Codex 路径
334
-
335
- 双路径模型。
336
-
337
- ### 需要统一迁移的接口语义
338
-
339
- 以下接口或字段不再应由 `codexDir` 推导:
340
-
341
- - `providersPath`
342
- - `backupsDir`
343
- - `latestBackupPath`
344
- - lock 文件路径
345
- - runtime install 路径
346
- - runtime state 路径
347
-
348
- 这些都应由 tool home 提供。
349
-
350
- ### 继续由目标 `codexDir` 提供的路径
351
-
352
- 以下路径继续属于目标 Codex runtime:
353
-
354
- - `configPath`
355
- - `authPath`
356
-
357
- ### lock 迁移
358
-
359
- 写锁从:
360
-
361
- - `codexDir/.codex-switch.lock`
362
-
363
- 迁移到:
364
-
365
- - tool home 下的 lock 文件
366
-
367
- ### backup 迁移
368
-
369
- 备份根目录从:
370
-
371
- - `codexDir/backups`
372
-
373
- 迁移到:
374
-
375
- - tool home 的 `backups/`
376
-
377
- ## 历史状态处理策略
378
-
379
- ### 开发期原则
380
-
381
- 本版不实现首次运行自动迁移,也不实现命令前自动迁移检查。
382
-
383
- ### 手动处理范围
384
-
385
- 对于旧布局状态:
386
-
387
- - 不自动迁移旧 `providers.json`
388
- - 不自动迁移旧 `backups/`
389
- - 不自动迁移旧 lock 文件
390
- - 不自动迁移旧 `~/.codex-switch` runtime/state
391
-
392
- 用户可自行:
393
-
394
- - 手动删除旧状态
395
- - 手动复制仍需保留的文件
396
- - 直接重新 `add provider`
397
-
398
- ## Copilot Runtime And Login
399
-
400
- ### Runtime install 归属
401
-
402
- Copilot runtime install 必须明确归属于 tool home:
403
-
404
- - 位于 `runtimes/` 下
405
-
406
- ### Runtime state 归属
407
-
408
- Copilot bridge runtime state 必须明确归属于 tool home:
409
-
410
- - 位于 `runtime/` 下
411
-
412
- ### `login copilot` 的成功定义
413
-
414
- `login copilot` 成功的定义是:
415
-
416
- - 本地 runtime 已可用
417
- - auth readiness recheck 成功
418
-
419
- 它不要求:
420
-
421
- - 创建 provider
422
- - 切换 active profile
423
- - 修改当前 `config.toml`
424
-
425
- ### `login copilot` 的失败边界
426
-
427
- 至少要能清楚表达以下失败类型:
428
-
429
- - 当前非 TTY,无法完成交互式登录
430
- - SDK 安装失败
431
- - 系统级 `copilot` CLI 缺失
432
- - `copilot login` 启动失败
433
- - 登录返回后 recheck 仍未通过
434
-
435
- ## Compatibility Goals
436
-
437
- ### 需要保持稳定的工作流
438
-
439
- 在新路径模型下,以下工作流需要保持行为稳定:
440
-
441
- - direct provider add / edit / remove / switch
442
- - backup / rollback
443
- - `status`
444
- - `doctor`
445
- - `bridge start`
446
- - `bridge stop`
447
- - `bridge status`
448
- - 端口恢复后 provider/config 投影写回
449
-
450
- ### 对 direct provider 的要求
451
-
452
- 本版虽然引入新的 tool home,但 direct provider 工作流不应出现行为回归。用户仍应能:
453
-
454
- - 使用新 home 内的 provider registry
455
- - 正常投影到目标 `config.toml`
456
- - 正常写入或读取目标 `auth.json`
457
-
458
- ### 对 Copilot provider 的要求
459
-
460
- Copilot provider 仍应保留当前 bridge / runtime 路由的核心语义,但其 install 与 login 入口改由 `login copilot` 承担。
461
-
462
- ## 错误语义
463
-
464
- ### 命令错误与诊断 issue 分层
465
-
466
- 本版继续保持两层语义:
467
-
468
- - CLI command failure `error.code`
469
- - `doctor` / `status` 中的 `issues[]`
470
-
471
- 二者不混为同一错误空间。
472
-
473
- ### 本版重点命令错误
474
-
475
- 本版重点涉及或需要保持清晰的错误语义包括:
476
-
477
- - `COPILOT_LOGIN_REQUIRES_TTY`
478
- - `COPILOT_SDK_MISSING`
479
- - `COPILOT_AUTH_REQUIRED`
480
- - `COPILOT_SDK_INSTALL_FAILED`
481
- - `COPILOT_SDK_UNSUPPORTED`
482
- - `COPILOT_CLI_MISSING`
483
- - `COPILOT_LOGIN_LAUNCH_FAILED`
484
- - `COPILOT_LOGIN_RECHECK_FAILED`
485
- - `INVALID_ARGUMENT`
486
-
487
- ### `add --copilot` 的推荐下一步
488
-
489
- 当 `add --copilot` 因 runtime / auth 前提不足失败时,错误 details 或消息中应清楚提示:
490
-
491
- - `codexs login copilot`
492
-
493
- 而不是再把用户引导回旧的 `add --install-copilot-sdk` 主流程。
494
-
495
- ## 公共契约
496
-
497
- 本版 PRD 需要显式固定以下对外契约:
498
-
499
- - `providers.json`、`backups/`、runtime state、runtime install 均属于 tool home
500
- - `config.toml` 与 `auth.json` 继续属于目标 Codex runtime
501
- - `codex-switch.json` 是工具级配置文件,不承载 provider registry
502
- - 默认目标 Codex 目录解析优先级为:
503
- - `--codex-dir`
504
- - `CODEXS_CODEX_DIR`
505
- - `codex-switch.json.defaultCodexDir`
506
- - 开发环境默认 sandbox
507
- - `~/.codex`
508
- - `login` 是 upstream auth / onboarding 命令,不是 provider mutation 命令
509
- - `login copilot` 的登录动作只通过系统级 `copilot login` 完成
510
- - `add --copilot` 在缺 runtime / 缺 auth 时只失败并给出下一步,不再承担安装/登录编排
511
- - 旧布局状态不属于 `0.0.11` 自动兼容范围
512
-
513
- ## 验收标准
514
-
515
- 达到以下条件时,`0.0.11` 可以认为完成:
516
-
517
- - 默认运行后,`providers.json`、`backups/`、runtime state、runtime install 都位于 `~/.config/codex-switch`
518
- - `config.toml` 与 `auth.json` 仍位于目标 `codexDir`
519
- - 未传 `--codex-dir` 时,CLI 能按新的优先级稳定解析目标 Codex 目录
520
- - `init` 只初始化 tool home,不混入 target runtime 检查
521
- - `login copilot` 在缺 SDK 时能完成 SDK 安装引导
522
- - `login copilot` 在缺 auth 且系统级 `copilot` CLI 可用时能启动官方登录
523
- - `login copilot` 在已登录时不重复启动官方登录
524
- - `add --copilot` 在缺 runtime / 缺 auth 时不再尝试安装或登录,只返回清楚下一步
525
- - `switch`、`doctor`、`status`、`rollback` 在新路径模型下语义保持稳定
526
- - 现有 direct provider 与 Copilot provider 工作流无行为回归
527
-
528
- ## 测试重点
529
-
530
- ### 路径解析
531
-
532
- - 默认 tool home 解析到 `~/.config/codex-switch`
533
- - `defaultCodexDir` 生效
534
- - `--codex-dir` 覆盖 config 默认值
535
- - `CODEXS_CODEX_DIR` 覆盖 tool config 默认值
536
-
537
- ### 存储初始化
538
-
539
- - `init` 创建 `codex-switch.json`
540
- - `init` 创建空 `providers.json`
541
- - `init` 自动写入 `defaultCodexDir`
542
- - 新 home 下 lock / backups / runtime / runtimes 目录按需创建
543
-
544
- ### `login copilot`
545
-
546
- - SDK 缺失时可确认安装
547
- - 已登录时不重复启动官方登录
548
- - 未登录时通过系统级 `copilot login` 启动登录
549
- - 系统级 `copilot` CLI 缺失时返回明确错误
550
- - `copilot login` 启动失败时返回明确错误
551
- - recheck 失败时返回明确错误
552
-
553
- ### `add --copilot`
554
-
555
- - 缺 runtime 返回 `COPILOT_SDK_MISSING` 并提示 `codexs login copilot`
556
- - 缺 auth 返回 `COPILOT_AUTH_REQUIRED` 并提示 `codexs login copilot`
557
- - 不再通过 `add` 驱动安装 / 登录主流程
558
-
559
- ### 回归
560
-
561
- - direct provider add / edit / remove / switch
562
- - backup / rollback
563
- - `status` / `doctor`
564
- - `bridge start` / `stop` / `status`
565
- - 端口恢复后 provider/config 投影写回
566
-
567
- ## 文档任务
568
-
569
- - 新增本 PRD:`docs/PRD/codex-switch-prd-v0.0.11.md`
570
- - 更正文档中所有“`providers.json` / `backups` 位于 `~/.codex`”的旧叙述
571
- - 更正文档中所有“`add --copilot` 负责安装/登录编排”的旧叙述
572
- - 明确 `login` 是 upstream onboarding 命令,不是 provider mutation 命令
573
- - 明确 `config.toml` / `auth.json` 属于目标 Codex runtime
574
-
575
- ## 结论
576
-
577
- `0.0.11` 的完成标准,不是“多了一个 `login copilot` 命令”,而是 `codex-switch` 终于拥有稳定、独立、可迁移的工具级 home 边界,并把上游登录从 provider 写操作里解耦出来。只有在这个基础上,后续多 upstream、多 runtime、甚至多 CLI 生态扩展,才不会继续被旧的路径和职责模型拖累。