@minniexcode/codex-switch 0.0.6 → 0.0.8

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 (53) hide show
  1. package/README.AI.md +5 -2
  2. package/README.md +12 -6
  3. package/dist/app/add-provider.js +90 -5
  4. package/dist/app/edit-provider.js +39 -11
  5. package/dist/app/get-status.js +31 -1
  6. package/dist/app/init-codex.js +68 -0
  7. package/dist/app/list-providers.js +1 -0
  8. package/dist/app/run-doctor.js +96 -1
  9. package/dist/app/setup-codex.js +18 -9
  10. package/dist/app/show-config.js +9 -1
  11. package/dist/app/switch-provider.js +61 -8
  12. package/dist/cli/add-interactive.js +4 -2
  13. package/dist/cli/args.js +3 -0
  14. package/dist/cli/help.js +3 -0
  15. package/dist/cli/interactive.js +3 -0
  16. package/dist/cli/output.js +20 -5
  17. package/dist/cli/prompt.js +3 -0
  18. package/dist/cli.js +1 -1
  19. package/dist/commands/handlers.js +107 -13
  20. package/dist/commands/help.js +2 -1
  21. package/dist/commands/registry.js +87 -15
  22. package/dist/domain/config.js +137 -0
  23. package/dist/domain/providers.js +90 -2
  24. package/dist/domain/setup.js +1 -0
  25. package/dist/infra/backup-repo.js +3 -0
  26. package/dist/infra/codex-cli.js +3 -0
  27. package/dist/infra/codex-paths.js +3 -0
  28. package/dist/infra/fs-utils.js +3 -0
  29. package/dist/infra/lock-repo.js +3 -0
  30. package/dist/infra/providers-repo.js +3 -0
  31. package/dist/interaction/add-interactive.js +9 -18
  32. package/dist/interaction/interactive.js +84 -11
  33. package/dist/runtime/codex-probe.js +7 -0
  34. package/dist/runtime/copilot-adapter.js +173 -0
  35. package/dist/runtime/copilot-bridge-worker.js +25 -0
  36. package/dist/runtime/copilot-bridge.js +433 -0
  37. package/dist/runtime/copilot-installer.js +125 -0
  38. package/dist/runtime/copilot-sdk-loader.js +59 -0
  39. package/dist/storage/auth-repo.js +160 -0
  40. package/dist/storage/config-repo.js +58 -0
  41. package/dist/storage/fs-utils.js +3 -0
  42. package/dist/storage/runtime-state-repo.js +80 -0
  43. package/docs/Design/codex-switch-v0.0.7-design.md +862 -0
  44. package/docs/Design/codex-switch-v0.0.8-design.md +132 -0
  45. package/docs/Design/codex-switch-v0.0.9-to-v0.0.12-roadmap.md +413 -0
  46. package/docs/PRD/codex-switch-prd-v0.0.5-to-v0.1.0.md +131 -25
  47. package/docs/PRD/codex-switch-prd-v0.0.8.md +62 -0
  48. package/docs/Reference/codex-config-reference.md +604 -0
  49. package/docs/Reference/codex-config-reference.zh-CN.md +633 -0
  50. package/docs/cli-usage.md +77 -29
  51. package/docs/test-report-0.0.7.md +118 -0
  52. package/docs/testing.md +67 -47
  53. package/package.json +1 -1
@@ -16,17 +16,18 @@
16
16
 
17
17
  说明:
18
18
 
19
- - 当前 active PRD 文件名沿用历史命名,但正文语义已更新为 `0.0.6`
19
+ - 当前 active PRD 文件名沿用历史命名,但正文语义已更新为 `0.0.7`
20
20
  - 本文档以“版本演进路线”而不是“文件名字面值”作为解释基准
21
21
 
22
22
  ## 一句话定义
23
23
 
24
- `codex-switch` 的 `0.1.0` 目标,是从一个已经具备 provider 管理、config consistency 和本地事务能力的 CLI,演进为一套对人类、AI 和后续集成层都稳定的发布级命令体系,并能够承载第三方 auth、本地代理和外部依赖接入这类扩展能力。
24
+ `codex-switch` 的 `0.1.0` 目标,是从一个已经具备 provider 管理、config consistency 和本地事务能力的 CLI,演进为一套对人类、AI 和后续集成层都稳定的发布级命令体系;其中 `0.0.7` 必须先完成 provider 配置模型纠偏,统一 `providers.json`、`config.toml` 与 `auth.json` 的职责边界。
25
25
 
26
26
  ## 版本语义
27
27
 
28
28
  - `0.0.x`:测试 / 验证阶段版本,用于收敛命令面、错误契约、事务安全与模块边界
29
29
  - `0.0.6`:稳定性修复 + 模块化重构里程碑,为后续 integration-ready 能力打基础
30
+ - `0.0.7`:Provider Configuration Correction,修复 provider secret 的配置落点,移除 `config.toml api_key` 假设,统一 `env_key` 驱动的运行态认证镜像
30
31
  - `0.1.0`:第一条稳定发布规格线,要求公共契约、恢复能力和扩展边界清晰
31
32
 
32
33
  ## `0.1.0` 总体目标
@@ -36,6 +37,7 @@
36
37
  - 保持 CLI 与 JSON 契约稳定
37
38
  - 保持 `setup`、provider registry、备份恢复主线能力不回退
38
39
  - 让 provider registry 与 linked config sections 的一致性成为默认能力
40
+ - 让 `providers.json`、`config.toml`、`auth.json` 的职责边界清晰且可诊断
39
41
  - 让备份、回滚和诊断继续覆盖所有关键写操作
40
42
  - 让模块边界足以承载未来第三方 auth / proxy / SDK 集成
41
43
  - 在不破坏主 CLI 契约的前提下扩展运行时能力边界
@@ -48,6 +50,7 @@
48
50
  - 不复用语义不匹配的错误码
49
51
  - 所有写命令默认纳入备份与回滚模型
50
52
  - 所有交互都只是 TTY 增强层,不改变自动化显式契约
53
+ - 不再把 provider secret 写入 `config.toml`
51
54
 
52
55
  ## 稳定公共契约
53
56
 
@@ -85,9 +88,10 @@
85
88
  "packycode": {
86
89
  "profile": "packycode",
87
90
  "apiKey": "sk-xxx",
91
+ "envKey": "PACKYCODE_API_KEY",
88
92
  "baseUrl": "https://example.com/v1",
89
- "note": "primary free model route",
90
- "tags": ["free", "daily"]
93
+ "note": "primary route",
94
+ "tags": ["paid"]
91
95
  }
92
96
  }
93
97
  }
@@ -97,16 +101,31 @@
97
101
 
98
102
  - `profile` 仍然必填
99
103
  - `apiKey` 仍按完整 managed provider 处理
104
+ - `envKey` 仍然必填
100
105
  - 不引入“半初始化 provider”作为正式稳定状态
101
106
 
107
+ `envKey` 的产品语义是:
108
+
109
+ - 与 `config.toml` 中 `[model_providers.<name>].env_key` 对应
110
+ - 作为当前 provider 写入 `auth.json` 时的目标键名
111
+ - 例如 `envKey = "PACKYCODE_API_KEY"` 时,切换后 `auth.json` 中应写入同名字段
112
+
102
113
  #### `config.toml`
103
114
 
104
115
  到 `0.1.0` 为止,`config.toml` 的定位继续是“部分受管的 runtime projection”:
105
116
 
106
117
  - 顶层 active `profile = "..."` 继续受管
107
118
  - 与 provider 关联的 `[profiles.<name>]` section 进入受管范围
119
+ - `[model_providers.<name>].base_url` 继续作为 runtime route 字段
120
+ - `[model_providers.<name>].env_key` 是当前唯一支持的 provider 认证配置字段
108
121
  - 非 provider 相关的顶层键、section 和注释仍允许存在,但不进入通用编辑器范围
109
122
 
123
+ 明确限制:
124
+
125
+ - `[model_providers.<name>].api_key` 不再是合法受管配置字段
126
+ - `codex-switch` 不再从 `config.toml` 读取或写入 provider secret
127
+ - 本版本不支持其他认证模式的受管配置界面
128
+
110
129
  #### `ManagedProfileFields`
111
130
 
112
131
  `0.1.0` 之前第一批稳定受管 profile 持久化字段继续锁定为最小集合:
@@ -122,8 +141,32 @@
122
141
 
123
142
  - 第一批正式受管字段锁 `model` 与 `model_provider`
124
143
  - `baseUrl` 作为读取视图字段,可由 `model_provider -> model_providers.<name>.base_url` 解析
144
+ - `envKey` 不属于 `[profiles.*]` 的受管字段,而属于 runtime provider section 与 managed registry 的一致性边界
125
145
  - 后续扩展 profile 字段时,只能做加法
126
146
 
147
+ #### `auth.json`
148
+
149
+ `auth.json` 是受管运行态认证镜像文件:
150
+
151
+ - 不是 provider registry 的事实源
152
+ - 当前激活 provider 的 `apiKey` 与 `envKey` 决定其内容
153
+ - 运行态 secret 只投影到 `auth.json`,不再投影到 `config.toml`
154
+
155
+ 当前稳定写入形态:
156
+
157
+ ```json
158
+ {
159
+ "auth_mode": "apikey",
160
+ "PACKYCODE_API_KEY": "sk-xxx"
161
+ }
162
+ ```
163
+
164
+ 约束:
165
+
166
+ - `auth_mode` 当前稳定为 `apikey`
167
+ - secret 键名不是固定 `OPENAI_API_KEY`
168
+ - secret 键名由当前 provider 的 `envKey` 决定
169
+
127
170
  ## `0.1.0` 模块化目标
128
171
 
129
172
  ### 核心结构方向
@@ -144,11 +187,16 @@
144
187
  `Runtime Integrations` 是 `0.1.0` 目标线中必须预留清楚的能力域,负责:
145
188
 
146
189
  - `codex` CLI 调用与可用性检查
147
- - 第三方 auth adapter
190
+ - 本地认证镜像写入与诊断
148
191
  - 本地 proxy runtime
149
192
  - 外部 SDK / 二进制依赖可用性探测
150
193
  - integration 级错误语义收敛
151
194
 
195
+ 说明:
196
+
197
+ - 当前主线只支持 `env_key` 模型
198
+ - 第三方 auth adapter 仍属于未来扩展方向,不是 `0.0.7` 的受管能力
199
+
152
200
  ## 已落地能力的 `0.1.0` 稳定化要求
153
201
 
154
202
  ### `setup`
@@ -160,14 +208,48 @@
160
208
  - 与 config 管理能力和未来 runtime integration 边界保持兼容
161
209
  - 对历史遗留不一致状态给出 adopt / repair 建议,而不是静默忽略
162
210
 
211
+ `0.0.7` 起,`setup` 的 adopt 规则明确收敛为:
212
+
213
+ - 只 adopt 已具备 `model`、`model_provider`、匹配 `model_providers.<name>.base_url`、匹配 `model_providers.<name>.env_key` 的 profile
214
+ - adopt 时从 runtime section 读取 `env_key`
215
+ - adopt 时不再从 `config.toml` 读取 `api_key`
216
+ - adopt 时只对 `apiKey` 进行交互补问或显式输入补全
217
+ - 非交互模式下,如果无法获得 `apiKey`,必须明确失败
218
+
219
+ 修复目标:
220
+
221
+ - `setup` 不得再因为缺失 `config.toml api_key` 而把合法 provider 判为 incomplete
222
+
163
223
  ### provider registry 命令
164
224
 
165
225
  `show`、`edit`、`import --merge`、`backups list`、`rollback <backup-id>` 的 `0.1.0` 要求是:
166
226
 
167
227
  - 保持命令名和基础 JSON 契约稳定
168
228
  - 把错误语义继续收紧
169
- - 让与 `config.toml` 关联的行为更完整
170
- - 不因引入第三方集成而改变现有 provider/config 的领域边界
229
+ - 让与 `config.toml` 和 `auth.json` 关联的行为更完整
230
+ - 不因引入未来第三方集成而改变现有 provider/config 的领域边界
231
+
232
+ 当前 provider registry 的稳定字段口径是:
233
+
234
+ - `profile`
235
+ - `apiKey`
236
+ - `envKey`
237
+ - `baseUrl`
238
+ - `note`
239
+ - `tags`
240
+
241
+ ### `switch`
242
+
243
+ `switch` 在 `0.1.0` 主线中的要求是:
244
+
245
+ - 更新 `config.toml` 顶层 active profile
246
+ - 根据目标 provider 的 `envKey` 和 `apiKey` 重写 `auth.json`
247
+ - 将 `config.toml` 与 `auth.json` 置于同一事务边界
248
+
249
+ 明确限制:
250
+
251
+ - `switch` 不再依赖 `config.toml api_key`
252
+ - `switch` 的成功条件之一,是 `auth.json` 中的键名和值与当前 provider 的 `envKey` / `apiKey` 一致
171
253
 
172
254
  ### `import --merge`
173
255
 
@@ -177,7 +259,7 @@
177
259
  - 不能只更新 `providers.json` 而放任 linked profile sections 漂移
178
260
  - 当导入结果引用了缺失 profile 时,必须进入与 `add` / `edit` 一致的受管规则
179
261
  - 非交互模式下,如果导入内容不能满足受管 profile 创建条件,应明确失败
180
- - 交互模式下可以进入 adopt 辅助流,但不会为缺失 `model_providers` runtime section 做隐式 repair
262
+ - 交互模式下可以进入 adopt 辅助流,但不会为缺失 `model_providers` runtime section 或缺失 `env_key` 做隐式 repair
181
263
 
182
264
  ## `0.1.0` 主线能力域
183
265
 
@@ -191,6 +273,7 @@
191
273
  - 稳定 `config-show`、`config-list-profiles`
192
274
  - 让 provider 管理命令可靠同步 linked profile sections
193
275
  - 明确共享 profile、孤儿 section 和 active profile 安全规则
276
+ - 诊断 `providers.json.envKey`、runtime `env_key` 与 `auth.json` 镜像键名之间的一致性
194
277
 
195
278
  ### Backup / Recovery Evolution
196
279
 
@@ -198,7 +281,10 @@
198
281
 
199
282
  - 保持 `backups` 与指定回滚能力稳定
200
283
  - 确保跨 `providers.json`、`config.toml`、`auth.json` 的多文件写入仍可完整恢复
201
- - 为更复杂的 runtime 变更继续复用同一事务模型
284
+ - 明确三者的职责边界:
285
+ - `providers.json` = 管理态事实源
286
+ - `config.toml` = provider/profile 路由事实源
287
+ - `auth.json` = 运行态认证镜像
202
288
 
203
289
  ### Error Contract Hardening
204
290
 
@@ -212,9 +298,9 @@
212
298
 
213
299
  目标:
214
300
 
215
- - 支持把第三方认证来源封装为独立 integration 能力
301
+ - 保留未来把第三方认证来源封装为独立 integration 能力的空间
216
302
  - 不把第三方 auth 状态直接混入 provider registry 事实源
217
- - token 获取、刷新、失效和依赖缺失提供稳定诊断语义
303
+ - 但当前主线不承诺 `env_key` 之外的其他认证模型
218
304
 
219
305
  ### Local Proxy Runtime
220
306
 
@@ -236,8 +322,7 @@
236
322
 
237
323
  GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目标:
238
324
 
239
- - 可作为第三方 auth adapter 的首个高价值案例
240
- - 可作为本地 proxy runtime 需求的首个真实驱动
325
+ - 可作为未来本地 proxy runtime 需求的首个真实驱动
241
326
  - 可用来验证 `Runtime Integrations` 分层是否足够清楚
242
327
 
243
328
  当前不提前锁定:
@@ -247,6 +332,11 @@ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目
247
332
  - `@github/copilot-sdk` 的封装形态
248
333
  - 本地代理协议和生命周期细节
249
334
 
335
+ 说明:
336
+
337
+ - Copilot 不再作为当前 auth 模型设计的直接驱动
338
+ - 当前主线只支持 `env_key` 模式
339
+
250
340
  ## 主题里程碑
251
341
 
252
342
  从 `0.0.5` 走向 `0.1.0`,建议按能力主题推进:
@@ -267,28 +357,38 @@ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目
267
357
  - 修复 `0.0.5` 已落地命令的稳定性问题
268
358
  - 统一 help、交互、错误语义和恢复模型
269
359
  - 解决 `cli.ts` 过重问题,明确 command / interaction / application / integration 边界
270
- - 为第三方 auth / proxy / SDK 集成建立 integration-ready 架构基础
360
+ - 为后续 integration-ready 架构建立清晰基础
361
+
362
+ ### 里程碑 C:`0.0.7` / Provider Configuration Correction
363
+
364
+ 目标:
365
+
366
+ - 去掉 `config.toml api_key` 假设
367
+ - 在 `providers.json` 中正式引入 `envKey`
368
+ - 将 runtime auth mirror 统一改为 `auth.json`
369
+ - 将 `setup`、`switch`、`doctor`、fixture、文档、测试统一到 `env_key` 模型
370
+ - 修正 provider secret 的采集、投影与恢复语义
271
371
 
272
- ### 里程碑 C:Backup / Recovery Evolution
372
+ ### 里程碑 D:Backup / Recovery Evolution
273
373
 
274
374
  目标:
275
375
 
276
376
  - 保持历史备份、显式回滚和多文件恢复稳定
277
377
  - 让更复杂的 runtime 变更继续复用同一事务模型
278
378
 
279
- ### 里程碑 D:Error Contract Hardening
379
+ ### 里程碑 E:Error Contract Hardening
280
380
 
281
381
  目标:
282
382
 
283
383
  - 收紧错误码语义
284
384
  - 区分环境错误、参数错误、配置解析错误和恢复错误
285
- - 对第三方 integration 的失败提供清晰可预测的错误契约
385
+ - 对外部 integration 的失败提供清晰可预测的错误契约
286
386
 
287
- ### 里程碑 E:Integrations & Runtime Expansion
387
+ ### 里程碑 F:Integrations & Runtime Expansion
288
388
 
289
389
  目标:
290
390
 
291
- - 逐步引入第三方 auth adapter
391
+ - 逐步引入第三方 integration
292
392
  - 逐步引入本地 proxy runtime
293
393
  - 逐步引入外部依赖可用性管理
294
394
  - 在不破坏主 CLI 契约的前提下扩展能力边界
@@ -303,6 +403,7 @@ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目
303
403
  - 所有新增错误码都必须语义清晰
304
404
  - 所有新增 JSON 返回都只能扩展 `data` 和 `warnings`
305
405
  - 结构化 TOML 写回不能破坏非受管部分
406
+ - provider secret 不再写入 `config.toml`
306
407
  - 第三方 integration 不得直接破坏 provider registry 作为 SSOT 的边界
307
408
  - 多候选目录发现和依赖可用性检查必须在交互与非交互模式下给出一致且可预测的行为
308
409
 
@@ -314,13 +415,15 @@ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目
314
415
  - `setup` 在多候选 Codex 目录场景下可交互选择或手动输入,在非交互场景下返回明确歧义错误
315
416
  - provider registry 的查看、编辑、导入合并能力完整
316
417
  - 用户和 AI 可以通过稳定命令结构化查看受管 `config.toml`
418
+ - 受管 provider 均具备 `profile`、`apiKey`、`envKey`
317
419
  - `add` / `edit` / `remove` 执行后,`providers.json` 与 linked profile sections 不再出现预期内的一致性漂移
420
+ - `switch` 能按当前 provider 的 `envKey` 将 `apiKey` 正确写入 `auth.json`
318
421
  - 共享 profile 场景不会误删仍被引用的 section
319
422
  - active profile 不会因为 provider 删除或 profile 迁移而变成悬空状态
320
- - 历史 `0.0.4` / `0.0.5` / `0.0.6` 状态可以被识别,并通过 adopt / repair 路径逐步收敛
423
+ - 历史 `0.0.4` / `0.0.5` / `0.0.6` / `0.0.7` 状态可以被识别,并通过 adopt / repair 路径逐步收敛
321
424
  - 历史备份可被显式枚举和恢复
322
425
  - CLI 错误码不再存在明显语义复用问题
323
- - 第三方 auth / proxy / 外部依赖能力可以通过独立 integration 边界接入,而不破坏主 CLI 契约
426
+ - 当前主线的 `env_key` provider 模型已稳定,后续 integration 可在此基础上扩展
324
427
 
325
428
  ## 建议测试场景
326
429
 
@@ -329,12 +432,15 @@ GitHub Copilot 在演进 PRD 中的定位是代表性用例,而不是唯一目
329
432
  - `config-show` 与 `config-list-profiles` 的稳定输出
330
433
  - 共享 profile 场景下的 `add` / `edit` / `remove` 行为
331
434
  - `setup` 在多目录候选下的交互和非交互分支
435
+ - `setup` 对缺失 `env_key` 的 profile 明确失败
436
+ - `setup` 在无 `config.toml api_key` 时仍可正常 adopt 合法 provider
332
437
  - `import --merge` 在缺失 profile / adopt / repair 下的一致性行为
333
438
  - 结构化 TOML 修改后,非受管内容、顺序和注释保持稳定
334
- - 双写失败时 `providers.json`、`config.toml` `auth.json` 能整体回滚
335
- - 历史 workspace、共享 profile、孤儿 profile section、缺失 linked section 都能被 `doctor` / `status` 正确识别
336
- - 外部 CLI / SDK / auth integration 缺失或不可用时,错误语义清晰且不污染核心 provider/config 状态
439
+ - `switch` 根据不同 provider 的 `envKey` 写入不同的 `auth.json` 键名
440
+ - 双写或三写失败时 `providers.json`、`config.toml` `auth.json` 能整体回滚
441
+ - 历史 workspace、共享 profile、孤儿 profile section、缺失 linked section、`envKey` 不一致都能被 `doctor` / `status` 正确识别
442
+ - 外部 CLI / SDK / integration 缺失或不可用时,错误语义清晰且不污染核心 provider/config 状态
337
443
 
338
444
  ## 结论
339
445
 
340
- `0.1.0` 不是简单把 `0.0.x` 重命名为稳定版,而是在保持当前本地事务式切换模型不变的前提下,进一步收敛 config 管理、错误契约、恢复能力和模块化扩展边界,并把第三方 auth、本地代理和外部依赖接入正式纳入主线能力域。
446
+ `0.1.0` 不是简单把 `0.0.x` 重命名为稳定版,而是在先完成 `0.0.7` 的 provider 配置模型纠偏之后,进一步收敛 config 管理、错误契约、恢复能力和模块化扩展边界,并把后续 integration 能力建立在清晰的 `providers.json`、`config.toml`、`auth.json` 分层之上。
@@ -0,0 +1,62 @@
1
+ # codex-switch `0.0.8` PRD
2
+
3
+ ## 文档信息
4
+
5
+ - 状态:Active PRD
6
+ - 产品名:`codex-switch`
7
+ - CLI 命令名:`codexs`
8
+ - 当前基线版本:`0.0.7`
9
+ - 目标版本:`0.0.8`
10
+ - 文档定位:定义 `0.0.7 -> 0.0.8` 的直接需求范围
11
+ - 关联设计文档:[`../Design/codex-switch-v0.0.8-design.md`](../Design/codex-switch-v0.0.8-design.md)
12
+
13
+ ## 一句话定义
14
+
15
+ `0.0.8` 的目标,是让用户可以把 GitHub Copilot 作为受管 provider 接入 Codex:通过官方 `@github/copilot-sdk` 完成上游鉴权与请求执行,并通过本地 OpenAI 兼容 bridge 供 Codex 使用。
16
+
17
+ ## In Scope
18
+
19
+ - 官方 `@github/copilot-sdk`
20
+ - 本地 Node/TypeScript bridge
21
+ - `POST /v1/chat/completions`
22
+ - JSON 和 stream 返回
23
+ - premium request 默认开启
24
+ - `add --copilot`
25
+ - `switch` 的 runtime gate
26
+ - `status` / `doctor` 的 Copilot runtime 诊断
27
+ - lazy-load SDK
28
+ - TTY 确认后自动安装 SDK
29
+ - 非交互 `--install-copilot-sdk`
30
+
31
+ ## Out of Scope
32
+
33
+ - 非官方 SDK
34
+ - 独立 `copilot` / `proxy` 命令族
35
+ - Responses API、Embeddings、图像/音频接口
36
+ - 持久化 GitHub token 到 `providers.json` / `auth.json`
37
+ - 多实例 bridge 编排
38
+ - GUI、后台控制台
39
+
40
+ ## 依赖策略
41
+
42
+ - `@github/copilot-sdk` 不进入 core CLI 默认依赖
43
+ - 命中 Copilot 路径时才 probe SDK
44
+ - SDK 运行前提是用户本机已具备可用的 GitHub Copilot CLI / login 状态,`codex-switch` 不托管这部分登录数据
45
+ - TTY 下缺失 SDK 时提示确认,确认后允许自动安装
46
+ - 安装目录固定为用户级 runtime 目录
47
+ - 非交互或 `--json` 默认失败
48
+ - 非交互只有在显式 `--install-copilot-sdk` 时才允许安装
49
+
50
+ ## 数据边界
51
+
52
+ - `providers.json` 保存本地 bridge 配置与 bridge shared secret
53
+ - `config.toml` 保存 bridge `base_url` 和 `env_key`
54
+ - `auth.json` 只保存 Codex 到 bridge 的 shared secret
55
+ - GitHub/Copilot 上游认证状态只由官方 SDK 管理,不进入受管 registry
56
+
57
+ ## 验收标准
58
+
59
+ - `add --copilot` 可以创建 Copilot provider
60
+ - `switch` 到 Copilot provider 时完成 `probe -> install if allowed -> auth check -> bridge health -> config/auth write`
61
+ - `status` / `doctor` 能诊断 SDK 缺失、安装失败、认证缺失、bridge 不健康、runtime base_url 漂移
62
+ - 现有 direct provider 行为不回退