@minniexcode/codex-switch 0.0.10 → 0.0.11

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 (38) hide show
  1. package/README.AI.md +52 -15
  2. package/README.CN.md +81 -48
  3. package/README.md +75 -34
  4. package/dist/app/add-provider.js +29 -15
  5. package/dist/app/bridge.js +15 -14
  6. package/dist/app/edit-provider.js +1 -1
  7. package/dist/app/get-status.js +13 -6
  8. package/dist/app/import-providers.js +1 -1
  9. package/dist/app/init-codex.js +13 -14
  10. package/dist/app/remove-provider.js +1 -1
  11. package/dist/app/run-doctor.js +12 -5
  12. package/dist/app/run-mutation.js +3 -2
  13. package/dist/app/setup-codex.js +3 -1
  14. package/dist/app/switch-provider.js +11 -13
  15. package/dist/cli.js +34 -2
  16. package/dist/commands/args.js +2 -2
  17. package/dist/commands/dispatch.js +40 -0
  18. package/dist/commands/handlers.js +121 -156
  19. package/dist/commands/help.js +2 -0
  20. package/dist/commands/registry.js +28 -9
  21. package/dist/domain/backups.js +4 -4
  22. package/dist/domain/config.js +110 -5
  23. package/dist/domain/providers.js +12 -0
  24. package/dist/domain/runtime-state.js +81 -5
  25. package/dist/runtime/copilot-adapter.js +12 -12
  26. package/dist/runtime/copilot-bridge.js +392 -44
  27. package/dist/runtime/copilot-cli.js +84 -12
  28. package/dist/runtime/copilot-installer.js +10 -9
  29. package/dist/runtime/copilot-sdk-loader.js +5 -5
  30. package/dist/storage/backup-repo.js +4 -4
  31. package/dist/storage/codex-paths.js +34 -8
  32. package/dist/storage/lock-repo.js +2 -4
  33. package/dist/storage/runtime-state-repo.js +14 -13
  34. package/dist/storage/tool-config-repo.js +111 -0
  35. package/docs/Design/codex-switch-v0.0.11-design.md +824 -0
  36. package/docs/PRD/codex-switch-prd-v0.0.11.md +577 -0
  37. package/docs/cli-usage.md +166 -295
  38. package/package.json +1 -1
package/docs/cli-usage.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # codex-switch CLI Usage
2
2
 
3
- 本文档详细介绍 `codex-switch` 在 `0.0.10` 版本中的命令、参数、交互规则和典型使用方式。
3
+ 本文档详细介绍 `codex-switch` 在 `0.0.11` 版本中的命令、参数、交互规则和典型使用方式。
4
4
 
5
5
  可执行命令名:
6
6
 
@@ -10,22 +10,35 @@ codexs
10
10
 
11
11
  ## 1. 概览
12
12
 
13
- `codex-switch` 用来管理本地 Codex 目录中的 provider/profile 配置,默认目标目录是 `~/.codex`。
13
+ `0.0.11` 开始,`codex-switch` 使用双路径模型:
14
14
 
15
- 它的核心设计有三点:
15
+ - tool home:保存 `codex-switch` 自己的管理态
16
+ - target Codex runtime:保存目标 Codex 的 `config.toml` 和 `auth.json`
16
17
 
17
- 1. 本地优先,不依赖远端服务保存状态
18
+ 核心设计:
19
+
20
+ 1. 本地优先,不依赖远端服务保存管理态
18
21
  2. 写入前先备份,异常时支持回滚
19
22
  3. 同时兼容人类终端使用和脚本/Agent 自动化调用
23
+ 4. 对 GitHub Copilot 这类交互式上游登录提供独立命令入口
20
24
 
21
- 默认管理的文件:
25
+ tool home 默认路径:
26
+
27
+ ```text
28
+ ~/.config/codex-switch/
29
+ codex-switch.json
30
+ providers.json
31
+ backups/
32
+ runtime/
33
+ runtimes/
34
+ ```
35
+
36
+ target Codex runtime 默认路径:
22
37
 
23
38
  ```text
24
39
  ~/.codex/
25
40
  config.toml
26
41
  auth.json
27
- providers.json
28
- backups/
29
42
  ```
30
43
 
31
44
  ## 2. 安装与入口
@@ -70,11 +83,23 @@ codexs --version
70
83
  说明:
71
84
 
72
85
  - `--json`:输出标准 JSON 结果,并禁用所有交互 prompt
73
- - `--codex-dir <path>`:将目标目录从默认 `~/.codex` 改成指定路径
86
+ - `--codex-dir <path>`:指定目标 Codex runtime 目录
74
87
  - `--help`:查看命令帮助
75
88
  - `--version`:输出当前 CLI 版本
76
89
 
77
- ### 3.2 交互规则
90
+ ### 3.2 环境变量
91
+
92
+ ```bash
93
+ CODEXS_HOME
94
+ CODEXS_CODEX_DIR
95
+ ```
96
+
97
+ 说明:
98
+
99
+ - `CODEXS_HOME`:覆盖默认 tool home 目录
100
+ - `CODEXS_CODEX_DIR`:在未传 `--codex-dir` 时提供默认 Codex runtime 目录
101
+
102
+ ### 3.3 交互规则
78
103
 
79
104
  CLI 的交互行为遵循以下规则:
80
105
 
@@ -82,8 +107,10 @@ CLI 的交互行为遵循以下规则:
82
107
  - 只要传入 `--json`,就绝不会出现 prompt
83
108
  - 面向脚本或 CI 的调用应显式传参,并优先使用 `--json`
84
109
  - 某些危险操作在交互模式下会确认,在非交互模式下则要求显式参数
110
+ - `login copilot` 必须在真实 TTY 中运行
111
+ - `migrate` 当前仍保留交互式 adopt 契约
85
112
 
86
- ### 3.3 备份与回滚
113
+ ### 3.4 备份与回滚
87
114
 
88
115
  所有受管理的写操作都会先备份相关文件,再执行写入。
89
116
 
@@ -93,6 +120,7 @@ CLI 的交互行为遵循以下规则:
93
120
  - `add`
94
121
  - `edit`
95
122
  - `switch`
123
+ - `bridge start`
96
124
  - `remove`
97
125
  - `import`
98
126
 
@@ -113,18 +141,6 @@ codexs rollback <backup-id>
113
141
  codexs list [--json] [--codex-dir <path>]
114
142
  ```
115
143
 
116
- 示例:
117
-
118
- ```bash
119
- codexs list
120
- codexs list --json
121
- ```
122
-
123
- 适用场景:
124
-
125
- - 查看当前已管理 provider 列表
126
- - 给后续 `switch`、`show`、`edit`、`remove` 提供候选名称
127
-
128
144
  ### 4.2 `show`
129
145
 
130
146
  查看单个 provider 的完整记录。
@@ -133,17 +149,10 @@ codexs list --json
133
149
  codexs show <provider> [--json] [--codex-dir <path>]
134
150
  ```
135
151
 
136
- 示例:
137
-
138
- ```bash
139
- codexs show packycode
140
- codexs show packycode --json
141
- ```
142
-
143
152
  说明:
144
153
 
145
- - 普通文本输出会默认隐藏 `apiKey`
146
- - `--json` 模式会输出完整 provider 数据,适合本地自动化
154
+ - 普通文本输出默认隐藏 `apiKey`
155
+ - `--json` 模式会返回完整 provider 数据
147
156
 
148
157
  ### 4.3 `current`
149
158
 
@@ -153,51 +162,57 @@ codexs show packycode --json
153
162
  codexs current [--json] [--codex-dir <path>]
154
163
  ```
155
164
 
156
- 示例:
165
+ ### 4.4 `status`
166
+
167
+ 输出目标 Codex runtime 的快速状态摘要。
157
168
 
158
169
  ```bash
159
- codexs current
160
- codexs current --json
170
+ codexs status [--json] [--codex-dir <path>]
161
171
  ```
162
172
 
163
- 说明:
173
+ 通常会覆盖这些信息:
164
174
 
165
- - 如果缺少 `config.toml`,或配置中没有顶层 profile,会直接报错
175
+ - 关键文件是否存在
176
+ - 当前激活 profile 是什么
177
+ - 当前运行态是否能在受管理 provider 映射中找到
178
+ - Copilot SDK 是否已安装
179
+ - Copilot bridge runtime state 是否健康
166
180
 
167
- ### 4.4 `status`
181
+ ### 4.5 `config show`
168
182
 
169
- 输出本地 Codex 目录的快速状态摘要。
183
+ 查看结构化 config profile 视图。
170
184
 
171
185
  ```bash
172
- codexs status [--json] [--codex-dir <path>]
186
+ codexs config show [profile] [--json] [--codex-dir <path>]
173
187
  ```
174
188
 
175
- 示例:
189
+ 说明:
176
190
 
177
- ```bash
178
- codexs status
179
- codexs status --json
180
- ```
191
+ - 不传 `[profile]` 时返回全部可识别 profile
192
+ - 可同时看到 managed、unmanaged 和 orphaned 引用
181
193
 
182
- 通常会覆盖这些信息:
194
+ ### 4.6 `config list-profiles`
183
195
 
184
- - 关键文件是否存在
185
- - 当前激活 profile 是什么
186
- - 当前运行态是否能在受管理的 provider 映射中找到
196
+ 列出可识别的 config profile 名称及其受管态提示。
187
197
 
188
- ### 4.5 `backups list`
198
+ ```bash
199
+ codexs config list-profiles [--json] [--codex-dir <path>]
200
+ ```
189
201
 
190
- 查看历史备份清单。
202
+ ### 4.7 `bridge status`
203
+
204
+ 查看当前受管 Copilot bridge 的运行状态。
191
205
 
192
206
  ```bash
193
- codexs backups list [--json] [--codex-dir <path>]
207
+ codexs bridge status [provider] [--json] [--codex-dir <path>]
194
208
  ```
195
209
 
196
- 示例:
210
+ ### 4.8 `backups list`
211
+
212
+ 查看历史备份清单。
197
213
 
198
214
  ```bash
199
- codexs backups list
200
- codexs backups list --json
215
+ codexs backups list [--json] [--codex-dir <path>]
201
216
  ```
202
217
 
203
218
  说明:
@@ -209,39 +224,39 @@ codexs backups list --json
209
224
 
210
225
  ### 5.1 `init`
211
226
 
212
- 轻量初始化目标 Codex 目录,确保 `providers.json` 已存在。
227
+ 初始化 codex-switch tool home 和 registry 文件。
213
228
 
214
229
  ```bash
215
230
  codexs init [--json] [--codex-dir <path>]
216
231
  ```
217
232
 
218
- 示例:
219
-
220
- ```bash
221
- codexs init
222
- codexs init --json
223
- codexs init --codex-dir ./.tmp-codex
224
- ```
225
-
226
233
  行为说明:
227
234
 
228
235
  - 不依赖 `codex` 可执行文件
229
- - 不要求 `config.toml` 或 `auth.json` 已存在
236
+ - 不要求目标 `config.toml` 或 `auth.json` 已存在
237
+ - `codex-switch.json` 不存在时创建
230
238
  - `providers.json` 不存在时创建空 registry:`{ "providers": {} }`
231
- - `providers.json` 已存在时返回成功 no-op,不改写文件,也不会创建备份
232
- - 成功 JSON 结果固定包含:`codexDir`、`createdCodexDir`、`createdProvidersFile`、`providersAlreadyExisted`、`configExists`、`authExists`
239
+ - 若显式传入 `--codex-dir` 且 `codex-switch.json` 尚不存在,`init` 会把它持久化为 `defaultCodexDir`
240
+ - 成功结果围绕 tool home 返回,不再承诺旧的 `createdCodexDir`、`configExists`、`authExists` 等字段
233
241
 
234
- 交互模式:
242
+ ### 5.2 `login copilot`
243
+
244
+ 完成 GitHub Copilot 上游安装与登录就绪检查。
235
245
 
236
- - 未显式传 `--codex-dir` 时,会复用候选目录发现并允许你选择或手动输入目录
237
- - 如果目标目录不存在,会确认是否创建目录
246
+ ```bash
247
+ codexs login copilot
248
+ codexs login github-copilot
249
+ ```
238
250
 
239
- 非交互模式:
251
+ 行为说明:
240
252
 
241
- - `--json` 或非 TTY 下绝不会进入 prompt
242
- - 目标目录不存在时直接返回结构化错误
253
+ - 当前支持 `copilot` `github-copilot` 两种拼写
254
+ - 若本地 Copilot SDK runtime 未安装,会先确认是否安装
255
+ - 若登录尚未就绪,会调用官方 `copilot login`,完成后做一次 recheck
256
+ - 该命令要求真实 TTY,不支持 `--json`
257
+ - 登录状态是共享的;切换 GitHub 账号会影响所有 Copilot provider
243
258
 
244
- ### 5.2 `migrate`
259
+ ### 5.3 `migrate`
245
260
 
246
261
  从现有 `config.toml` adopt unmanaged profiles,并写入受管理的 `providers.json`。
247
262
 
@@ -249,33 +264,15 @@ codexs init --codex-dir ./.tmp-codex
249
264
  codexs migrate [--json] [--codex-dir <path>] [--merge|--overwrite]
250
265
  ```
251
266
 
252
- 示例:
253
-
254
- ```bash
255
- codexs migrate
256
- codexs migrate --overwrite --json
257
- codexs migrate --merge --codex-dir ./.tmp-codex
258
- ```
259
-
260
267
  行为说明:
261
268
 
262
269
  - 读取 `config.toml` 中已有 profile
263
- - 仅 adopt 已具备 `model`、`model_provider` 且能解析到匹配 `model_providers.*.base_url` 的 unmanaged profile
270
+ - 仅 adopt 已具备 `model`、`model_provider` 且能解析到匹配 `base_url` 的 unmanaged profile
264
271
  - 收集每个 profile 对应的 provider 记录
265
- - 保持现有受管备份、锁和 post-run `doctor` 流程,不重写 `auth.json`
266
-
267
- 交互模式:
268
-
269
- - 如果 `providers.json` 已存在,会让你选择 `merge`、`overwrite` 或取消
270
- - profile 选择和 provider 细节收集仍然只在 TTY 中进行
272
+ - 保持受管备份、锁和 post-run `doctor` 流程
273
+ - 非交互模式下,profile 选择和 provider 细节收集仍不会自动化展开
271
274
 
272
- 非交互模式:
273
-
274
- - `providers.json` 已存在时,必须显式传入 `--merge` 或 `--overwrite`
275
- - `--json` 模式下不会进入任何引导式输入
276
- - 由于 adopt profile 选择和 provider secret 收集仍然是交互契约,当前版本会直接失败
277
-
278
- ### 5.3 `setup`
275
+ ### 5.4 `setup`
279
276
 
280
277
  `setup` 已弃用,不再执行实际初始化或迁移工作。
281
278
 
@@ -283,104 +280,49 @@ codexs migrate --merge --codex-dir ./.tmp-codex
283
280
  codexs setup
284
281
  ```
285
282
 
286
- 行为说明:
287
-
288
- - 该命令现在返回 `COMMAND_DEPRECATED`
289
- - 错误详情中包含 `replacements: ["init", "migrate"]`
290
- - 应改用 `codexs init` 或 `codexs migrate`
291
-
292
- ### 5.4 `add`
283
+ ### 5.5 `add`
293
284
 
294
- 新增一个 provider。`add` 当前同时支持 direct provider 和 Copilot bridge provider 两条路径。
285
+ 新增一个 provider。`add` 同时支持 direct provider 和 Copilot bridge provider
295
286
 
296
287
  ```bash
297
288
  codexs add <provider> --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]
289
+ codexs add <provider> --copilot --profile <name> [--bridge-host <host>] [--bridge-port <port>] [--bridge-api-key <secret>]
290
+ codexs add <provider> --profile <name> --api-key <key> --create-profile --model <name> --base-url <url>
299
291
  codexs add
300
292
  ```
301
293
 
302
- direct provider 示例:
303
-
304
- ```bash
305
- codexs add packycode --profile packycode --api-key sk-xxx
306
- codexs add packycode --profile packycode --api-key sk-xxx --tag paid --tag daily
307
- codexs add
308
- ```
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 字段说明:
318
-
319
- - `provider`:provider 名称,也是后续 `switch/show/edit/remove` 的标识
320
- - `--profile`:写入到 `config.toml` 的 profile 名称
321
- - `--api-key`:provider API key
322
- - `--base-url`:可选的 provider 元数据,不会写回 `[profiles.*]`
323
- - `--note`:备注
324
- - `--tag`:标签,可重复传多次
325
-
326
- Copilot provider 字段说明:
294
+ 说明:
327
295
 
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
296
+ - direct provider 必须提供 `provider`、`profile`、`apiKey`
297
+ - `--create-profile` 可在 profile 缺失时一并创建目标 profile
298
+ - direct provider 创建新 profile 时需要同时给出 `--model` `--base-url`
299
+ - Copilot provider 创建新 profile 时需要 `--create-profile` `--model`
300
+ - `--copilot` 下禁止 `--api-key`,应使用 `--bridge-api-key`
301
+ - `add --copilot` 不再负责安装 SDK 或触发登录,应先执行 `codexs login copilot`
302
+ - `--install-copilot-sdk` 现在只保留为 rejected compatibility flag
335
303
 
336
304
  交互模式:
337
305
 
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`
345
-
346
- 非交互模式:
306
+ - direct provider 缺少必填项时会在 TTY 中补问
307
+ - Copilot provider 的交互流不会要求 direct API key
308
+ - tags 交互使用 preset multi-select
347
309
 
348
- - direct provider 必须显式传入所有必填字段
349
- - `add --copilot` 必须显式传入 `<provider>` 和 `--profile`
350
- - `add --copilot --json` 不会进入任何 prompt;若 SDK 缺失且未传 `--install-copilot-sdk`,直接失败;若 auth 未就绪,也直接返回 `COPILOT_AUTH_REQUIRED`
351
-
352
- ### 5.5 `edit`
310
+ ### 5.6 `edit`
353
311
 
354
312
  编辑单个 provider 的字段。
355
313
 
356
314
  ```bash
357
315
  codexs edit <provider> [--profile <name>] [--api-key <key>] [--base-url <url>] [--note <text>] [--tag <tag> ...] [--json] [--codex-dir <path>]
316
+ codexs edit <provider> --profile <name> --create-profile --model <name> --base-url <url>
358
317
  ```
359
318
 
360
- 示例:
361
-
362
- ```bash
363
- codexs edit packycode --note primary
364
- codexs edit packycode --api-key sk-new --base-url https://example.com/v1
365
- codexs edit packycode --tag daily --tag paid
366
- ```
367
-
368
- 行为说明:
319
+ 说明:
369
320
 
370
- - 只会更新你显式传入的字段
371
- - 未传入的字段保持不变
321
+ - 只更新显式传入的字段
372
322
  - `--tag` 会替换整组标签,而不是追加单个 tag
373
- - 写入前会备份 `providers.json`
374
-
375
- 交互模式:
376
-
377
- - 如果没有传任何可编辑字段,TTY 下会进入交互编辑
378
-
379
- 非交互模式:
323
+ - 当目标 profile 不存在时,可配合 `--create-profile`、`--model`、`--base-url` 完成重绑定
380
324
 
381
- - 至少要提供一个需要修改的字段
382
-
383
- ### 5.6 `switch`
325
+ ### 5.7 `switch`
384
326
 
385
327
  切换当前使用的 provider/profile。
386
328
 
@@ -388,88 +330,63 @@ codexs edit packycode --tag daily --tag paid
388
330
  codexs switch <provider> [--json] [--codex-dir <path>]
389
331
  ```
390
332
 
391
- 示例:
392
-
393
- ```bash
394
- codexs switch freemodel
395
- codexs switch freemodel --json
396
- codexs switch
397
- ```
398
-
399
333
  行为说明:
400
334
 
401
335
  - 根据 `providers.json` 找到目标 provider
402
- - 更新相关运行态配置
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`
336
+ - direct provider 会切换 active profile,并将 `auth.json` 重写为 `auth_mode=apikey` 与 `OPENAI_API_KEY=<provider.apiKey>`
337
+ - Copilot bridge provider 会维护本地 bridge 路由,并将认证投影写到本地 bridge secret
338
+ - Copilot bridge provider 会在切换前检查 SDK 和上游登录状态
339
+ - 切换前会备份 `config.toml` `auth.json`
406
340
 
407
- 交互模式:
341
+ ### 5.8 `bridge start`
408
342
 
409
- - 如果没有传 `<provider>`,TTY 下会弹出 provider 选择器
410
- - 如果已经传了 `<provider>`,则直接执行,不再额外确认
411
-
412
- ### 5.7 `remove`
413
-
414
- 删除一个 provider 记录。
415
-
416
- ```bash
417
- codexs remove <provider> [--force] [--json] [--codex-dir <path>]
418
- ```
419
-
420
- 示例:
343
+ 启动或复用受管 Copilot bridge。
421
344
 
422
345
  ```bash
423
- codexs remove freemodel
424
- codexs remove freemodel --force --json
346
+ codexs bridge start [provider] [--json] [--codex-dir <path>]
425
347
  ```
426
348
 
427
- 行为说明:
349
+ 说明:
428
350
 
429
- - 删除的是 `providers.json` 中的记录
430
- - 删除前会备份 `providers.json`
351
+ - 可通过显式 provider、当前 active provider、唯一 provider 或 TTY 选择来解析目标
352
+ - 如果预期端口被占用,会自动寻找新的 5 位端口并持久化
431
353
 
432
- 交互模式:
354
+ ### 5.9 `bridge stop`
433
355
 
434
- - 如果没传 provider,可以在 TTY 中选择
435
- - 无论是否显式传入 provider,交互模式下都会要求确认删除
356
+ 停止受管 Copilot bridge。
436
357
 
437
- 非交互模式:
438
-
439
- - 必须同时传入 `<provider>` 和 `--force`
358
+ ```bash
359
+ codexs bridge stop [provider] [--json] [--codex-dir <path>]
360
+ ```
440
361
 
441
- ### 5.8 `import`
362
+ 说明:
442
363
 
443
- 从外部 JSON 文件导入 provider 配置。
364
+ - 不修改 `providers.json`
365
+ - 在没有运行中的受管 bridge 时保持幂等
444
366
 
445
- ```bash
446
- codexs import <file> [--merge] [--json] [--codex-dir <path>]
447
- ```
367
+ ### 5.10 `remove`
448
368
 
449
- 示例:
369
+ 删除一个 provider 记录。
450
370
 
451
371
  ```bash
452
- codexs import ./providers.json
453
- codexs import ./providers.json --merge
454
- codexs import ./providers.json --merge --json
372
+ codexs remove <provider> [--force] [--switch-to <profile>] [--json] [--codex-dir <path>]
455
373
  ```
456
374
 
457
- 行为说明:
458
-
459
- - 默认会用导入文件替换当前 `providers.json`
460
- - 加上 `--merge` 后,会按 provider 名称做浅合并
461
- - 冲突时,以导入文件中的 provider 记录为准
375
+ 说明:
462
376
 
463
- 交互模式:
377
+ - 删除的是 `providers.json` 中的记录
378
+ - 如果删除的 provider 是当前 active profile 的最后一个绑定项,可先传 `--switch-to`
379
+ - 非交互模式下必须同时传入 `<provider>` 和 `--force`
464
380
 
465
- - 会在写入前确认是替换还是合并结果
381
+ ### 5.11 `import`
466
382
 
467
- 非交互模式:
383
+ 从外部 JSON 文件导入 provider 配置。
468
384
 
469
- - 不会弹出路径向导或确认框
470
- - 会先验证输入文件,再执行写入
385
+ ```bash
386
+ codexs import <file> [--merge] [--json] [--codex-dir <path>]
387
+ ```
471
388
 
472
- ### 5.9 `export`
389
+ ### 5.12 `export`
473
390
 
474
391
  导出当前 `providers.json` 到指定文件。
475
392
 
@@ -477,22 +394,9 @@ codexs import ./providers.json --merge --json
477
394
  codexs export <file> [--force] [--json] [--codex-dir <path>]
478
395
  ```
479
396
 
480
- 示例:
481
-
482
- ```bash
483
- codexs export ./providers-backup.json
484
- codexs export ./providers-backup.json --force
485
- ```
486
-
487
- 行为说明:
488
-
489
- - 将当前受管理 provider 注册表导出为外部 JSON 文件
490
-
491
- 覆盖规则:
397
+ 说明:
492
398
 
493
- - 如果目标文件不存在,直接导出
494
- - 如果目标文件已存在,交互模式下会询问是否覆盖
495
- - 非交互模式下必须显式传 `--force`
399
+ - 目标文件已存在时,非交互模式下必须显式传 `--force`
496
400
 
497
401
  ## 6. 诊断与恢复
498
402
 
@@ -504,19 +408,13 @@ codexs export ./providers-backup.json --force
504
408
  codexs doctor [--json] [--codex-dir <path>]
505
409
  ```
506
410
 
507
- 示例:
508
-
509
- ```bash
510
- codexs doctor
511
- codexs doctor --json
512
- ```
513
-
514
411
  通常会检查:
515
412
 
516
413
  - 必要文件是否存在
517
414
  - provider/profile 映射是否一致
518
415
  - 当前运行态是否有漂移
519
416
  - Codex CLI 是否可用
417
+ - Copilot SDK、登录状态和 bridge runtime 是否健康
520
418
 
521
419
  ### 6.2 `rollback`
522
420
 
@@ -526,27 +424,6 @@ codexs doctor --json
526
424
  codexs rollback [<backup-id>] [--json] [--codex-dir <path>]
527
425
  ```
528
426
 
529
- 示例:
530
-
531
- ```bash
532
- codexs rollback
533
- codexs rollback 20260511-221457-switch
534
- codexs rollback 20260511-221457-switch --json
535
- ```
536
-
537
- 行为说明:
538
-
539
- - 不带参数时,默认回滚最近一次受管备份
540
- - 传入 `<backup-id>` 时,回滚到指定备份
541
-
542
- 交互模式:
543
-
544
- - 会先展示目标备份和受影响文件,再要求确认
545
-
546
- 非交互模式:
547
-
548
- - 直接执行,不会二次确认
549
-
550
427
  ## 7. JSON 输出与自动化建议
551
428
 
552
429
  如果你是在脚本、CI 或 Agent 环境中调用,建议遵循以下约束:
@@ -560,17 +437,8 @@ codexs <command> --json
560
437
  - 始终显式传入必需参数,不依赖交互输入
561
438
  - 使用 `--json` 获取稳定输出
562
439
  - 对危险命令显式传入控制参数,例如 `--force`、`--merge`、`--overwrite`
563
- - 对多环境调试使用 `--codex-dir <path>`,避免误改默认 `~/.codex`
564
-
565
- 适合自动化的例子:
566
-
567
- ```bash
568
- codexs list --json
569
- codexs show packycode --json
570
- codexs switch packycode --json
571
- codexs export ./providers.snapshot.json --force --json
572
- codexs rollback 20260511-221457-switch --json
573
- ```
440
+ - 对多环境调试使用 `--codex-dir <path>` `CODEXS_HOME`
441
+ - 不要在自动化环境中调用 `login copilot`
574
442
 
575
443
  ## 8. 典型使用流程
576
444
 
@@ -583,7 +451,7 @@ codexs list
583
451
  codexs doctor
584
452
  ```
585
453
 
586
- ### 8.2 新增并切换到一个 provider
454
+ ### 8.2 新增并切换到一个 direct provider
587
455
 
588
456
  ```bash
589
457
  codexs add my-provider --profile my-provider --api-key sk-xxx
@@ -591,25 +459,27 @@ codexs switch my-provider
591
459
  codexs current
592
460
  ```
593
461
 
594
- ### 8.3 批量迁移 provider 配置
462
+ ### 8.3 接入 GitHub Copilot provider
595
463
 
596
464
  ```bash
597
- codexs export ./providers.backup.json
598
- codexs import ./team.providers.json --merge
599
- codexs doctor
465
+ codexs login copilot
466
+ codexs add copilot-main --copilot --profile copilot-main
467
+ codexs switch copilot-main
468
+ codexs bridge status copilot-main
600
469
  ```
601
470
 
602
- ### 8.4 出现错误后恢复
471
+ ### 8.4 检查 config profile 与受管态映射
603
472
 
604
473
  ```bash
605
- codexs backups list
606
- codexs rollback
474
+ codexs config list-profiles
475
+ codexs config show
607
476
  ```
608
477
 
609
- 或者:
478
+ ### 8.5 出现错误后恢复
610
479
 
611
480
  ```bash
612
- codexs rollback <backup-id>
481
+ codexs backups list
482
+ codexs rollback
613
483
  ```
614
484
 
615
485
  ## 9. 危险命令说明
@@ -621,6 +491,7 @@ codexs rollback <backup-id>
621
491
  - `add`
622
492
  - `edit`
623
493
  - `switch`
494
+ - `bridge start`
624
495
  - `remove`
625
496
  - `import`
626
497
  - `export`(目标文件已存在时)
@@ -630,7 +501,7 @@ codexs rollback <backup-id>
630
501
 
631
502
  - 人工操作先执行 `backups list`
632
503
  - 自动化操作统一加 `--json`
633
- - 在测试目录中先用 `--codex-dir <path>` 验证流程
504
+ - 在测试目录中先用 `--codex-dir <path>` 与 `CODEXS_HOME` 验证流程
634
505
 
635
506
  ## 10. 查看命令帮助
636
507
 
@@ -644,10 +515,10 @@ codexs --help
644
515
 
645
516
  ```bash
646
517
  codexs help init
647
- codexs help migrate
648
- codexs help setup
518
+ codexs help login
519
+ codexs help bridge
520
+ codexs help config
649
521
  codexs help add
650
522
  codexs help switch
651
- codexs help backups
652
523
  codexs help rollback
653
524
  ```