@minniexcode/codex-switch 0.0.9 → 0.0.10

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 (36) hide show
  1. package/README.AI.md +5 -3
  2. package/README.CN.md +25 -3
  3. package/README.md +3 -2
  4. package/dist/app/add-provider.js +0 -11
  5. package/dist/app/bridge.js +0 -1
  6. package/dist/app/edit-provider.js +1 -17
  7. package/dist/app/get-status.js +24 -9
  8. package/dist/app/list-providers.js +0 -1
  9. package/dist/app/run-doctor.js +11 -36
  10. package/dist/app/setup-codex.js +27 -17
  11. package/dist/app/show-config.js +1 -5
  12. package/dist/app/switch-provider.js +5 -20
  13. package/dist/cli/output.js +4 -6
  14. package/dist/cli.js +1 -1
  15. package/dist/commands/handlers.js +192 -39
  16. package/dist/commands/registry.js +7 -5
  17. package/dist/domain/config.js +4 -68
  18. package/dist/domain/providers.js +0 -5
  19. package/dist/domain/runtime-state.js +2 -1
  20. package/dist/domain/setup.js +58 -3
  21. package/dist/interaction/add-interactive.js +55 -1
  22. package/dist/interaction/interactive.js +1 -5
  23. package/dist/runtime/copilot-adapter.js +44 -1
  24. package/dist/runtime/copilot-bridge.js +2 -2
  25. package/dist/runtime/copilot-cli.js +70 -0
  26. package/dist/runtime/copilot-installer.js +49 -2
  27. package/dist/storage/auth-repo.js +28 -77
  28. package/dist/storage/config-repo.js +1 -36
  29. package/dist/storage/runtime-state-repo.js +32 -0
  30. package/docs/Design/codex-switch-copilot-integration-design.md +517 -0
  31. package/docs/Design/codex-switch-v0.0.10-design.md +669 -0
  32. package/docs/PRD/codex-switch-prd-v0.0.10.md +406 -0
  33. package/docs/cli-usage.md +38 -14
  34. package/docs/codex-switch-product-overview.md +2 -2
  35. package/docs/codex-switch-technical-architecture.md +6 -5
  36. package/package.json +1 -1
@@ -0,0 +1,406 @@
1
+ # codex-switch `0.0.10` PRD
2
+
3
+ ## 文档信息
4
+
5
+ - 状态:Active PRD
6
+ - 产品名:`codex-switch`
7
+ - CLI 命令名:`codexs`
8
+ - 当前基线版本:`0.0.9`
9
+ - 目标版本:`0.0.10`
10
+ - 文档定位:定义 `0.0.9 -> 0.0.10` 的直接需求范围
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.9.md`](./codex-switch-prd-v0.0.9.md)
13
+
14
+ ## 一句话定义
15
+
16
+ `0.0.10` 是一个 hardening release:以当前代码行为为事实边界,收敛 `migrate` 前置检查、`doctor` / `status` 诊断清晰度、backup / rollback 失败语义、runtime state 安全读取和 release correctness,而不是扩展新的大 JSON 契约或新的状态模型。
17
+
18
+ ## In Scope
19
+
20
+ - `migrate` 迁移前置检查与交互收敛
21
+ - `doctor` 诊断文案与 issue 收口
22
+ - `status` 结果可读性与解释性增强
23
+ - `backups list` / `rollback` 恢复体验与失败语义澄清
24
+ - runtime state 文件的安全读取与问题归类
25
+ - `--version` / package / 打包产物的 release correctness
26
+ - 与上述范围直接相关的测试与文档补齐
27
+
28
+ ## Out of Scope
29
+
30
+ - 新增大型命令族
31
+ - 新增 repair / fix 命令
32
+ - 非交互式 `migrate` 完整支持
33
+ - 新的 `status.health.*` 聚合 schema
34
+ - 新的 `doctor` 并行诊断结构
35
+ - 把 `auth.json` 变成 active provider secret mirror
36
+ - 将 runtime state 纳入 managed backup 的强事务保证
37
+
38
+ ## 当前版本问题
39
+
40
+ `0.0.9` 已经具备 direct provider 与 Copilot bridge provider 的主流程,但 `0.0.10` 之前仍有几类边界不够清楚:
41
+
42
+ - `migrate` 在进入交互前,对“哪些 profile 可 adopt、哪些不可 adopt、原因是什么”的表达不够直接
43
+ - `providers.json` 已存在但 registry 为空时,`merge` / `overwrite` 提示没有价值
44
+ - `doctor` 与 `status` 现有信息量足够,但文档对其稳定结构、问题边界和错误层级说明不足
45
+ - 旧 PRD 把 `auth.json` 描述成 provider secret mirror,这与当前实现不符
46
+ - runtime state 的读取和问题分类需要以安全读取为目标,但不应发明两套未定义的新错误契约
47
+ - `backups list` / `rollback` 对损坏 manifest、缺失备份文件、latest 与显式 backup id 的行为边界需要写清
48
+ - release correctness 除 CLI `--version` 外,还需要把公开文档中的版本标注一致性纳入发布前检查
49
+
50
+ ## 核心目标
51
+
52
+ `0.0.10` 需要完成以下几件事:
53
+
54
+ - 让 `migrate` 在 adopt 流程之前先说明“能不能迁、为什么不能迁”
55
+ - 让 `doctor` 和 `status` 围绕当前已有结构给出更清楚的状态解释
56
+ - 让 backup / rollback 的成功载荷、失败语义与覆盖边界可预期
57
+ - 让 runtime state 的读取从“信任输入”转为“安全读取并分类问题”
58
+ - 让发布检查覆盖版本号、打包产物与公开文档版本标注
59
+
60
+ ## 数据边界与术语
61
+
62
+ `0.0.10` 明确以当前实现为准,固定以下术语:
63
+
64
+ - `providers.json`
65
+ - 管理态 registry
66
+ - 是 managed state 的 SSOT
67
+ - `config.toml`
68
+ - 运行态路由投影
69
+ - 反映当前 active profile 与 runtime 配置
70
+ - `auth.json`
71
+ - 独立认证状态文件
72
+ - 只做存在性、可解析性和基础元数据读取
73
+ - 不是 active provider 的 secret mirror
74
+ - runtime state
75
+ - Copilot bridge 的本地运行态文件
76
+ - 用于读路径上的运行态观测和问题归类
77
+ - 不属于 managed backup 的强保证事务边界
78
+ - backups
79
+ - 针对 managed files 的恢复依据
80
+ - 不承诺恢复运行中的 bridge 进程或外部登录态
81
+
82
+ 本版 PRD 删除以下旧说法:
83
+
84
+ - `auth mirror`
85
+ - `auth mirror mismatch`
86
+ - `auth.json` key/value 必须与 active provider secret 对齐
87
+ - 把 runtime state manifest invalid 同时写成命令错误和 issue 错误两套未定义契约
88
+
89
+ ## `migrate` 目标
90
+
91
+ ### 1. adoptability 前置检查
92
+
93
+ `0.0.10` 中,`migrate` 的重点不是扩展导入能力,而是把交互式 adopt 路径做扎实。
94
+
95
+ 必须满足:
96
+
97
+ - 在 strategy prompt 前先完成 adoptability 预检查
98
+ - 若没有任何 adoptable profiles,命令必须立即失败,不再进入后续交互
99
+ - 空 registry 场景要在 adopt 流程前被识别,避免无意义提示
100
+
101
+ 允许作为本版新增命令错误码:
102
+
103
+ - `MIGRATE_NO_ADOPTABLE_PROFILES`
104
+
105
+ 若引入该错误码,PRD 只固定以下 `details` 边界:
106
+
107
+ - `availableProfiles` 是稳定字段
108
+ - `adoptableProfiles` 是稳定字段
109
+ - `blockingReasonsByProfile` 字段存在本身是稳定契约
110
+ - `blockingReasonsByProfile` 中的 reason 文本只保证人类可读,不保证固定枚举
111
+
112
+ adopt 阻塞原因应与当前 config consistency 模型对齐,重点覆盖:
113
+
114
+ - profile 缺 `model`
115
+ - profile 缺 `model_provider`
116
+ - `model_provider` 名称与 profile 不匹配
117
+ - 对应 `model_providers.<name>` section 缺失
118
+ - `base_url` 缺失
119
+ - `env_key` 缺失
120
+
121
+ ### 2. 空 registry 交互策略
122
+
123
+ 当 `providers.json` 已存在但 registry 为空时:
124
+
125
+ - 跳过 `merge` / `overwrite` 提示
126
+ - 继续按低风险初始化语义执行
127
+ - 内部可按 `overwrite` 语义处理,但无需把这件事包装成新的对外 schema
128
+
129
+ ### 3. 非交互式 `migrate` 边界
130
+
131
+ `0.0.10` 不新增完整的非交互式 `migrate` profile 选择或 secret 注入参数。
132
+
133
+ 因此:
134
+
135
+ - 非交互式 `migrate` 继续失败
136
+ - 错误消息和帮助文档需要更清楚
137
+ - 现有 `adoptableProfiles` / `availableProfiles` 细节可继续暴露
138
+ - 本版不承诺自动化 migrate contract
139
+
140
+ ## `doctor` 目标
141
+
142
+ `doctor` 的目标是收敛到当前已有的 `doctor.data.issues[]` 模型,不再发明并行的诊断结构。
143
+
144
+ ### 稳定输出方向
145
+
146
+ - `doctor.data.issues[]` 继续作为主诊断输出
147
+ - `message` 应更易读、更可执行
148
+ - “下一步怎么做”在 `0.0.10` 中可以通过 message / warning 文案表达
149
+ - 本版不强制新增独立结构化 `nextAction` 字段
150
+
151
+ ### `0.0.10` 应明确覆盖的诊断域
152
+
153
+ - config / providers 一致性问题
154
+ - 例如 active profile 未受管、profile linkage 冲突、`model_provider` / `base_url` / `env_key` 缺失或不一致
155
+ - `AUTH_JSON_INVALID`
156
+ - 仅在 auth 文件存在但不可解析时报告
157
+ - Codex runtime probe 问题
158
+ - `CODEX_NOT_INSTALLED`
159
+ - `CODEX_VERSION_UNSUPPORTED`
160
+ - `CODEX_LOGIN_FAILED`
161
+ - Copilot / bridge 相关问题
162
+ - `COPILOT_SDK_MISSING`
163
+ - `COPILOT_AUTH_REQUIRED`
164
+ - `BRIDGE_STATE_MISSING`
165
+ - `BRIDGE_STATE_STALE`
166
+ - `PROVIDER_BASE_URL_MISMATCH`
167
+ - `BRIDGE_HEALTHCHECK_FAILED`
168
+
169
+ ### 本版明确不做的诊断
170
+
171
+ - 不检查 `auth.json` 与 active provider 的 key/value mirror 一致性
172
+ - 不把 `auth.json` 解析成功后的内容提升成 provider ownership 语义
173
+ - 不新增第二套面向自动化的大 JSON 诊断合同
174
+
175
+ ## `status` 目标
176
+
177
+ `status` 在 `0.0.10` 的目标是保持当前 JSON shape 稳定,同时提升“易读性”和“解释性”;本版不要求新增 `health.*` 契约。
178
+
179
+ ### 当前 JSON shape 作为事实边界
180
+
181
+ `status` 的重点继续围绕现有字段表达:
182
+
183
+ - `currentProfile`
184
+ - `currentProfileMapped`
185
+ - `provider`
186
+ - `activeProviderResolvable`
187
+ - `activeProviderCandidates`
188
+ - `copilotSdk`
189
+ - `copilotAuth`
190
+ - `copilotBridge`
191
+ - `copilotRuntimeState`
192
+ - `liveState`
193
+ - `auth`
194
+ - `issues`
195
+ - `storage`
196
+
197
+ ### `status.data.auth` 的稳定边界
198
+
199
+ `status.data.auth` 在 `0.0.10` 中固定为中性文件元数据:
200
+
201
+ - `exists`
202
+ - `valid`
203
+ - `parseError`
204
+ - `authMode`
205
+
206
+ 它不包含:
207
+
208
+ - provider secret ownership
209
+ - managed key 列表
210
+ - auth mirror 一致性结论
211
+
212
+ ### `status.data.storage` 的稳定边界
213
+
214
+ `status.data.storage` 在 `0.0.10` 中固定为:
215
+
216
+ - `managementSSOT: "providers.json"`
217
+ - `runtimeMirrors: ["config.toml"]`
218
+ - `authStateFile: "auth.json"`
219
+ - `rollbackState: "backups/latest.json"`
220
+
221
+ ### 本版不做的事
222
+
223
+ - 不强制新增 `health.overall`
224
+ - 不强制新增 `health.configProjection`
225
+ - 不强制新增 `health.authMirror`
226
+ - 不强制新增 `health.runtime`
227
+ - 不强制新增 `health.summary`
228
+
229
+ “health summary” 可以作为未来版本候选,但不是 `0.0.10` 必交项。
230
+
231
+ ## backup / rollback 目标
232
+
233
+ ### `backups list`
234
+
235
+ `backups list` 章节按当前稳定输出定义:
236
+
237
+ - `backupId`
238
+ - `createdAt`
239
+ - `reason`
240
+ - `files`
241
+ - `backupPath`
242
+
243
+ 补充要求:
244
+
245
+ - warnings 用于提示损坏或缺失 manifest 的历史项
246
+ - `file count` 可以作为展示层派生信息,但不是新的稳定 JSON 字段
247
+
248
+ ### `rollback`
249
+
250
+ `rollback` 章节按当前行为收口:
251
+
252
+ - success 返回稳定载荷:
253
+ - `restoredFiles`
254
+ - `backupId`
255
+ - `backupPath`
256
+ - 要明确区分 `rollback latest` 与显式 `rollback <backupId>` 两条路径
257
+ - 失败语义先按当前命令错误收口:
258
+ - `BACKUP_NOT_FOUND`
259
+ - `ROLLBACK_FAILED`
260
+
261
+ 如果希望推动更细粒度失败分类,必须明确写清:
262
+
263
+ - 是新增 `error.code`
264
+ - 还是仅在 `error.details.reason` 中细分
265
+
266
+ 不能继续使用模糊表述。
267
+
268
+ ### rollback 覆盖边界
269
+
270
+ 文档必须明确:
271
+
272
+ - rollback 的强保证只覆盖 managed files
273
+ - rollback 不保证恢复运行中的 bridge 进程状态
274
+ - rollback 不覆盖外部 runtime install side effects
275
+ - rollback 不覆盖上游登录 / session 状态
276
+ - runtime state 与运行中进程状态不属于同等级 rollback 保证
277
+
278
+ ## runtime state 目标
279
+
280
+ runtime state 在 `0.0.10` 中的目标是“安全读取与问题归类”,而不是引入新的未落地合同。
281
+
282
+ 要求:
283
+
284
+ - runtime state 文件读取必须安全包装
285
+ - 需要能在读路径上区分常见问题来源,例如:
286
+ - 文件缺失
287
+ - 不可解析或脏数据
288
+ - provider 绑定陈旧
289
+ - active profile 绑定陈旧
290
+ - base URL 漂移
291
+ - healthcheck 失败
292
+ - 对 direct provider 场景,不应因为存在脏 runtime state 而导致误导性崩溃
293
+
294
+ 本版不要求:
295
+
296
+ - 为“invalid runtime-state manifest shape”同时定义新的命令错误码和新的 issue code
297
+ - 把 runtime state 纳入 managed backup 事务
298
+
299
+ ## release correctness 目标
300
+
301
+ `0.0.10` 需要把 release correctness 作为显式质量目标。
302
+
303
+ 至少包括:
304
+
305
+ - built CLI `--version` 与 `package.json` version 对齐
306
+ - 测试不再写死历史版本号
307
+ - `npm pack` 产物 sanity check
308
+ - 仓库公开文档中的版本标注一致性纳入发布前检查
309
+
310
+ 最后一项需要明确写入本版要求,因为当前公开文档仍可能残留旧版本字样。
311
+
312
+ ## 错误语义
313
+
314
+ `0.0.10` 需要在 PRD 中明确区分两层错误语义:
315
+
316
+ - CLI command failure `error.code`
317
+ - `doctor` / `status` 中 `issues[]` 的 issue code
318
+
319
+ 要求:
320
+
321
+ - 两者命名尽量对齐
322
+ - 但两者不是同一层契约
323
+ - 不应在 PRD 中混写成一个统一错误空间
324
+
325
+ 本版需要明确说明:
326
+
327
+ - `MIGRATE_NO_ADOPTABLE_PROFILES` 若引入,是命令错误码
328
+ - 它不是 `doctor` issue code
329
+ - 也不是 `status` issue code
330
+
331
+ ## 公开契约
332
+
333
+ 本版 PRD 需要显式声明以下对外契约:
334
+
335
+ - `status.data.auth` 是中性文件元数据,不含 provider secret ownership,不含 managed key 列表
336
+ - `doctor` 不检查 `auth.json` 与 active provider 的 key/value 镜像一致性;只在 auth 文件存在但不可解析时报告 `AUTH_JSON_INVALID`
337
+ - `backups list` 的稳定列表项是 `backupId`、`createdAt`、`reason`、`files`、`backupPath`
338
+ - `rollback` 的稳定成功载荷是 `restoredFiles`、`backupId`、`backupPath`
339
+ - `0.0.10` 若新增 `MIGRATE_NO_ADOPTABLE_PROFILES`,这是命令错误码,不是 `doctor` 或 `status` 的 issue code
340
+
341
+ ## 验收标准
342
+
343
+ 达到以下条件时,`0.0.10` 可以认为完成:
344
+
345
+ - `migrate` 在 0 adoptable profiles 场景下立即失败,不再继续无意义交互
346
+ - 缺 `model` / 缺 `model_provider` / linkage 不合法 / 缺 `base_url` / 缺 `env_key` 时,adoptability 结果能解释阻塞原因
347
+ - 空 `providers.json` registry 不再触发多余的 `merge` / `overwrite` 提示
348
+ - `doctor` 继续以 `issues[]` 为主,并对 auth parse failure、config consistency、Codex probe、Copilot bridge 问题给出清楚结论
349
+ - `status` 保持当前 shape 稳定,并能围绕现有字段解释 active provider、映射状态、runtime 相关状态
350
+ - direct provider 和 Copilot provider 在存在脏 runtime state 时都能稳定输出
351
+ - `backups list` / `rollback` 对损坏 manifest、缺失备份文件、latest 与显式 backup id 路径给出清楚结果
352
+ - built CLI `--version` 与 `package.json` version 保持一致
353
+ - 发布检查覆盖 `npm pack` 和公开文档版本标注一致性
354
+
355
+ ## 测试重点
356
+
357
+ ### `migrate`
358
+
359
+ - 0 adoptable profiles 立即失败
360
+ - 空 registry 跳过 strategy prompt
361
+ - 非交互式失败消息更清楚
362
+ - profile 缺 `model`
363
+ - profile 缺 `model_provider`
364
+ - profile 的 `model_provider` 命名不匹配
365
+ - profile 缺 `base_url`
366
+ - profile 缺 `env_key`
367
+
368
+ ### `doctor` / `status`
369
+
370
+ - `AUTH_JSON_INVALID`
371
+ - config / profile / provider consistency issues
372
+ - `COPILOT_SDK_MISSING`
373
+ - `COPILOT_AUTH_REQUIRED`
374
+ - `BRIDGE_STATE_MISSING`
375
+ - `BRIDGE_STATE_STALE`
376
+ - `PROVIDER_BASE_URL_MISMATCH`
377
+ - `BRIDGE_HEALTHCHECK_FAILED`
378
+ - direct provider 场景下存在脏 runtime state 时仍稳定输出
379
+
380
+ ### backup / rollback
381
+
382
+ - invalid or missing manifest warnings in `backups list`
383
+ - `BACKUP_NOT_FOUND`
384
+ - `ROLLBACK_FAILED`
385
+ - restore missing backup file
386
+ - `rollback latest`
387
+ - 显式 `rollback <backupId>`
388
+
389
+ ### release correctness
390
+
391
+ - built CLI `--version`
392
+ - `package.json` version
393
+ - `npm pack` sanity check
394
+ - 仓库公开文档版本标注一致性
395
+
396
+ ## 文档任务
397
+
398
+ - 明确说明 `migrate` adoptability 前置条件
399
+ - 说明 `doctor` / `status` 的当前 JSON 边界,而不是发明新的 `health.*` schema
400
+ - 文档化 rollback 覆盖范围与非覆盖范围
401
+ - 说明 runtime state 的用途与限制
402
+ - 更新 CLI usage 中 `migrate`、`doctor`、`status`、`backups list`、`rollback` 的行为描述
403
+
404
+ ## 结论
405
+
406
+ `0.0.10` 不是扩命令面的版本,而是一次边界对齐和正确性收敛。它的完成标准不是“新增多少 schema”,而是“现有 CLI 在迁移、诊断、回滚和发布这几条关键路径上,是否能用当前真实实现给出稳定、清楚、低误导性的行为与文档承诺”。
package/docs/cli-usage.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # codex-switch CLI Usage
2
2
 
3
- 本文档详细介绍 `codex-switch` 在 `0.0.4` 版本中的命令、参数、交互规则和典型使用方式。
3
+ 本文档详细介绍 `codex-switch` 在 `0.0.10` 版本中的命令、参数、交互规则和典型使用方式。
4
4
 
5
5
  可执行命令名:
6
6
 
@@ -260,9 +260,9 @@ codexs migrate --merge --codex-dir ./.tmp-codex
260
260
  行为说明:
261
261
 
262
262
  - 读取 `config.toml` 中已有 profile
263
- - 仅 adopt 已具备 `model`、`model_provider` 且能解析到匹配 `model_providers.*.base_url` 和 `env_key` 的 unmanaged profile
263
+ - 仅 adopt 已具备 `model`、`model_provider` 且能解析到匹配 `model_providers.*.base_url` 的 unmanaged profile
264
264
  - 收集每个 profile 对应的 provider 记录
265
- - 保持现有受管备份、锁、`auth.json` mirror 和 post-run `doctor` 流程
265
+ - 保持现有受管备份、锁和 post-run `doctor` 流程,不重写 `auth.json`
266
266
 
267
267
  交互模式:
268
268
 
@@ -291,14 +291,15 @@ codexs setup
291
291
 
292
292
  ### 5.4 `add`
293
293
 
294
- 新增一个 provider
294
+ 新增一个 provider。`add` 当前同时支持 direct provider 和 Copilot bridge provider 两条路径。
295
295
 
296
296
  ```bash
297
297
  codexs add <provider> --profile <name> --api-key <key> [--base-url <url>] [--note <text>] [--tag <tag> ...]
298
- codexs add [--profile <name>] [--api-key <key>] [--base-url <url>] [--note <text>] [--tag <tag> ...]
298
+ codexs add <provider> --copilot --profile <name> [--bridge-host <host>] [--bridge-port <port>] [--bridge-api-key <secret>] [--install-copilot-sdk]
299
+ codexs add
299
300
  ```
300
301
 
301
- 示例:
302
+ direct provider 示例:
302
303
 
303
304
  ```bash
304
305
  codexs add packycode --profile packycode --api-key sk-xxx
@@ -306,7 +307,14 @@ codexs add packycode --profile packycode --api-key sk-xxx --tag paid --tag daily
306
307
  codexs add
307
308
  ```
308
309
 
309
- 字段说明:
310
+ Copilot provider 示例:
311
+
312
+ ```bash
313
+ codexs add copilot-main --copilot --profile copilot-main --install-copilot-sdk
314
+ codexs add copilot-main --copilot --profile copilot-main --bridge-port 41415 --bridge-api-key local-secret
315
+ ```
316
+
317
+ direct provider 字段说明:
310
318
 
311
319
  - `provider`:provider 名称,也是后续 `switch/show/edit/remove` 的标识
312
320
  - `--profile`:写入到 `config.toml` 的 profile 名称
@@ -315,16 +323,31 @@ codexs add
315
323
  - `--note`:备注
316
324
  - `--tag`:标签,可重复传多次
317
325
 
326
+ Copilot provider 字段说明:
327
+
328
+ - `--copilot`:切换到 Copilot provider 模式
329
+ - `--profile`:必填
330
+ - `--api-key`:在 `--copilot` 下禁止使用;Copilot 不接收 direct provider API key
331
+ - `--bridge-host`:本地 bridge host,默认 `127.0.0.1`
332
+ - `--bridge-port`:本地 bridge port,默认 `41415`
333
+ - `--bridge-api-key`:本地 bridge shared secret;留空时自动生成
334
+ - `--install-copilot-sdk`:允许在首次接入时安装可选 Copilot SDK runtime
335
+
318
336
  交互模式:
319
337
 
320
- - 如果缺少 `provider`、`profile`、`apiKey`,会在 TTY 中补问
321
- - profile 选择会优先复用现有 `config.toml` profile
322
- - API key 的隐藏输入会做二次确认
323
- - tag 仅支持预设选项多选
338
+ - direct provider 缺少 `provider`、`profile`、`apiKey` 时,会在 TTY 中补问
339
+ - direct provider API key 隐藏输入会做二次确认
340
+ - Copilot provider 会先做固定 preflight:检查 SDK、必要时立即安装、检查 GitHub Copilot 登录态、必要时执行官方 `copilot login`,全部通过后才进入专用输入流
341
+ - Copilot provider 的专用输入流只采集 provider/profile/model、note/tags 和 bridge 参数
342
+ - Copilot provider 不会提示 `API key`、`Confirm API key` 或输出 `API key is required.`
343
+ - 若官方 `copilot login` 无法启动,会回退为人工提示:运行 `copilot login`,完成 GitHub 官方 device/browser 流程后执行一次明确 recheck
344
+ - `add --copilot --json` 永远不会启动登录流程;若 auth 未就绪,直接返回 `COPILOT_AUTH_REQUIRED`,并提示手动运行 `copilot login`
324
345
 
325
346
  非交互模式:
326
347
 
327
- - 必须显式传入所有必填字段
348
+ - direct provider 必须显式传入所有必填字段
349
+ - `add --copilot` 必须显式传入 `<provider>` 和 `--profile`
350
+ - `add --copilot --json` 不会进入任何 prompt;若 SDK 缺失且未传 `--install-copilot-sdk`,直接失败;若 auth 未就绪,也直接返回 `COPILOT_AUTH_REQUIRED`
328
351
 
329
352
  ### 5.5 `edit`
330
353
 
@@ -377,8 +400,9 @@ codexs switch
377
400
 
378
401
  - 根据 `providers.json` 找到目标 provider
379
402
  - 更新相关运行态配置
380
- - 重写当前 active provider 对应的 `auth.json` mirror
381
- - 会先备份 `config.toml` `auth.json`
403
+ - direct provider 会切换当前 active profile,并将 `auth.json` 重写为 `auth_mode = "apikey"` 和 `OPENAI_API_KEY = <provider.apiKey>`
404
+ - Copilot bridge provider 不写 `OPENAI_API_KEY`,而是维护本地 bridge 路由
405
+ - 备份 `config.toml`,并在 direct provider 切换时一并备份 `auth.json`
382
406
 
383
407
  交互模式:
384
408
 
@@ -150,7 +150,7 @@ MVP 的能力范围主要包括:
150
150
 
151
151
  - `config.toml` 是主配置文件
152
152
  - `providers.json` 是 `codex-switch` 自身维护的 provider 清单
153
- - `auth.json` 在存在时会被纳入备份与回滚考虑
153
+ - `auth.json` 是当前 active direct provider 的认证投影文件;切换 direct provider 时会刷新 `OPENAI_API_KEY`
154
154
  - `backups/` 用于保存历史备份
155
155
 
156
156
  产品不会要求用户先理解全部内部实现,只暴露统一的命令接口。
@@ -167,7 +167,7 @@ MVP 的能力范围主要包括:
167
167
 
168
168
  ### 场景 3:切换到目标 provider
169
169
 
170
- 用户执行切换命令后,工具会完成校验、备份、修改和必要的登录动作。
170
+ 用户执行切换命令后,工具会完成校验、备份、修改运行态配置,并在 direct provider 场景下同步 `auth.json`。
171
171
 
172
172
  ### 场景 4:出现异常时恢复
173
173
 
@@ -98,7 +98,7 @@
98
98
  - `Low Coupling`
99
99
  - 参数解析、业务编排、文件访问、错误模型彼此解耦
100
100
  - `Split State Model`
101
- - `providers.json` 是管理态事实源,`config.toml` / `auth.json` 是运行态镜像
101
+ - `providers.json` 是管理态事实源,`config.toml` 是运行态路由文件,`auth.json` 是 direct provider 的认证投影
102
102
  - `Lightweight Transactions`
103
103
  - 单次写操作要有锁、备份、回滚边界
104
104
 
@@ -125,7 +125,8 @@ Infrastructure 层
125
125
  当前实现还明确区分三类状态对象:
126
126
 
127
127
  - 管理态单一事实源:`providers.json`
128
- - 运行态镜像:`config.toml`、`auth.json`
128
+ - 运行态路由:`config.toml`
129
+ - 当前 active direct provider 的认证投影:`auth.json`
129
130
  - 回滚态:`backups/latest.json` 和对应 manifest
130
131
 
131
132
  这意味着未来即使引入 GUI / MCP / HTTP 适配层,核心同步目标仍然是 runtime files,而不是把 runtime files 本身当成长期管理数据库。
@@ -555,13 +556,13 @@ scripts/
555
556
  - 深度解析 profile 内部更多字段
556
557
  - 管理 base URL 或模型等 profile 内容
557
558
 
558
- 它在当前架构里属于运行态镜像,只承担“当前活跃 profile 落地”的职责。
559
+ 它在当前架构里是 direct provider 的认证投影文件,不承担 provider 选择职责,也不作为 provider registry 的事实源。
559
560
 
560
561
  ### 5.3 `auth.json`
561
562
 
562
563
  当前实现不直接建模其内部字段,但它有明确架构角色:
563
564
 
564
- - 属于运行态镜像
565
+ - 属于 direct provider 的认证投影
565
566
  - 在存在时纳入备份与回滚
566
567
  - 不是 provider registry 的事实源
567
568
 
@@ -622,7 +623,7 @@ scripts/
622
623
  6. 校验 provider 对应的 `profile` 在配置中存在
623
624
  7. 创建备份:
624
625
  - `config.toml`
625
- - `auth.json`(如果存在)
626
+ - `auth.json` 仅在历史备份清单已包含时由 rollback 兼容恢复
626
627
  8. 更新顶层 `profile`
627
628
  9. 如果未传 `--no-login`,执行 `codex login --with-api-key`
628
629
  10. 成功后把这次备份记录为 `latest.json`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minniexcode/codex-switch",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "description": "Local-first CLI for managing and switching Codex provider/profile configuration.",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",